Сценарий init.d не работает.... но команда работает, если я выполняю ее в консоли

У меня есть команда, которая работает нормально, если я выполнил ее из командной строки... но когда я помещаю ее в сценарий init.d, она не запускается (ну.. она запускается, но ведет себя иначе, чем при запуске) напрямую).

Любая идея, почему это не работает на сценарии инициализации?

Команда: bluepill load /var/www/html/bluepill.conf

И скрипт init.d это:

    #!/bin/sh

    ## Based on http://www.novell.com/coolsolutions/feature/15380.html
    # chkconfig: 345 99 1
    # processname: solr
    # Provides: bluepill
    # Default-Start: 3 4 5
    # Default-Stop: 0 1 2 6
    # Short-Description: bluepill daemon, providing process monitoring
    # Description: Bluepill

    # Check for missing binaries
    BLUEPILL_BIN=/usr/local/bin/bluepill
    test -x $BLUEPILL_BIN || { echo "$BLUEPILL_BIN not installed";
            if [ "$1" = "stop" ]; then exit 0;
            else exit 5; fi; }

    # Check for existence of needed config file and read it
    BLUEPILL_CONFIG=/var/www/html/bluepill.conf
    test -r $BLUEPILL_CONFIG || { echo "$BLUEPILL_CONFIG not existing";
            if [ "$1" = "stop" ]; then exit 0;
            else exit 6; fi; }

    case "$1" in
      start)
        echo -n "Starting bluepill "
        $BLUEPILL_BIN load $BLUEPILL_CONFIG
        ;;
      stop)
        echo -n "Shutting down bluepill "
        $BLUEPILL_BIN quit
        ;;
      restart)
        ## Stop the service and regardless of whether it was
        ## running or not, start it again.
        $0 stop
        $0 start
      ;;
      *)
        ## If no parameters are given, print which are avaiable.
        echo "Usage: $0 {start|stop|restart}"
        exit 1
        ;;
    esac

Обновление (чтобы ответить на несколько вопросов):

Я также добавил скрипт, чтобы он выполнялся во время загрузки, используя:

chkconfig --add bluepill_script  
chkconfig --level 345 bluepill_script  on  

7 ответов

Решение

Попробуйте добавить

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin

в начало сценария инициализации.

Я повторю призыв Камиля к выводу при запуске.

Кроме того, вы пытались chkconfig --add bluepill а также chkconfig bluepill on,

В противном случае, держу пари, это какая-то переменная окружения в скрипте. Попробуйте найти среду в начале через . /etc/profile или т.п. Тем более, что, похоже, он установлен в /usr/local/bin. Может потребоваться, чтобы PATH или LD_LIBRARY_PATH были установлены правильно.

Я использую следующий скрипт init.d, и у меня возникла похожая проблема, потому что гем bluepill был установлен под установкой rvm. Заметьте, что нужно указывать переменную окружения rvm, но этого можно было бы добиться с помощью источника /etc/profile (поскольку он также там установлен). Я использую рецепт поваренной книги Opscode, чтобы установить их, поэтому эти пути будут переменными, если поваренная книга rvm устанавливает свои драгоценные камни.

#!/bin/bash
#
# Bluepill
#
# chkconfig: - 85 15
# description: start, stop, restart bluepill
#

RETVAL=0

if [[ -s /usr/local/rvm/scripts/rvm ]] ; then source /usr/local/rvm/scripts/rvm ; fi

case "$1" in
    start)
      for i in /etc/bluepill/*.pill; do
        /usr/local/rvm/gems/ruby-1.9.2-p180/bin/bluepill load $i
      done
      RETVAL=$?
  ;;
    stop)
      /usr/local/rvm/gems/ruby-1.9.2-p180/bin/bluepill stop
      /usr/local/rvm/gems/ruby-1.9.2-p180/bin/bluepill quit
      RETVAL=$?
  ;;
    restart)
      /usr/local/rvm/gems/ruby-1.9.2-p180/bin/bluepill restart
      RETVAL=$?
  ;;
    status)
      /usr/local/rvm/gems/ruby-1.9.2-p180/bin/bluepill status
      RETVAL=$?
  ;;
    *)
      echo "Usage: bluepill {start|stop|restart|status}"
      exit 1
  ;;
esac

exit $RETVAL

Хорошо .. тупой вопрос, но вы установили скрипт для запуска при загрузке? Я более знаком с дистрибутивами в стиле Debian, но вам могут пригодиться ntsysv или chkconfig.

Вам также может понадобиться поместить ссылку в одну из /etc/rcX-папок (в зависимости от предполагаемого уровня запуска) и запустить

sudo run update-rc.d SkriptnameWithinInitDWithoutPath по умолчанию

Еще один тупой вопрос, загружается ли bluepill в память после запуска скрипта? ps -ef | grep bluepill

Отсутствие ошибок в журнале не является четким признаком того, что скрипт init работает. Два простых шага отладят это.

  1. Добавьте некоторые детали отладки внутри скрипта. Мне нравится записывать номер строки в файл журнала с разных точек сценария. Нет выхода? Тогда это почти наверняка не запустить.
  2. Убедитесь, что скрипт действительно запущен, когда вы думаете, что он это сделал, как уже заявили несколько других. Если он не запускается, это может объяснить отсутствие сообщений об ошибках в журналах.
Другие вопросы по тегам