Назад | Перейти на главную страницу

Скрипт init.d работает при ручном запуске, но не при перезагрузке

Я пытаюсь настроить сервер RhodeCode на Ubuntu 12.04. У меня все установлено в virtualenv, и все работает правильно, когда я запускаю его с консоли (paster serve production.ini).

Я написал сценарий init.d, запускающий его при загрузке, но он, похоже, не работает. Когда я выполняю sudo /etc/init.d/rhodecode start вручную я вижу "Запуск RhodeCode" эхом на консоли, и все работает. Однако, если я перезагружусь или использую sudo service rhodecode start, Я вижу, что сообщение выводится на консоль, но процессы Python не работают.

Я установил скрипт, используя update-rc.d rhodecode defaults.

Изучая, как этого добиться, источники, которые я нашел, предположили, что мне не нужно запускать source /usr/rhode/venv если я запустил питон прямо из каталога virtualenv. Успешный запуск этого с консоли без первой активации virtualenv, похоже, подтверждает эту теорию. В страница virtualenv, кажется, подтверждает это:

Если вы запускаете скрипт или интерпретатор python напрямую из каталога bin / виртуального сервера (например, путь / к / env / bin / pip или / путь / к / env / bin / python script.py), активация не требуется.

Для получения более подробной информации о том, как я настроил сервер, этот Gist показывает мои заметки о том, что я сделал до сих пор: Установка RhodeCode 1.3.6 на Ubuntu Server 12.04

/etc/init.d/rhodecode

#!/bin/sh

### BEGIN INIT INFO
# Provides:       rhodecode
# Required-Start: $all
# Required-Stop:  $all
# Default-Start:  2 3 4 5
# Default-Stop:   0 1 6
# Short-Description: Starts RhodeCode
### END INIT INFO

USER=rhodeuser

VENV_DIR=/usr/rhode/venv
DATA_DIR=/usr/rhode/data

CELERY_ARGS="$VENV_DIR/bin/paster celeryd $DATA_DIR/production.ini"
RHODECODE_ARGS="$VENV_DIR/bin/paster serve $DATA_DIR/production.ini"

CELERY_PID_FILE=/var/run/celeryd.pid
RHODECODE_PID_FILE=/var/run/rhodecode.pid

start_celery() {
    /sbin/start-stop-daemon \
        --start \
        --background \
        --chuid $USER \
        --pidfile $CELERY_PID_FILE \
        --exec $VENV_DIR/bin/python -- $CELERY_ARGS
}

start_rhodecode() {
    /sbin/start-stop-daemon \
        --start \
        --background \
        --chuid $USER \
        --pidfile $RHODECODE_PID_FILE \
        --exec $VENV_DIR/bin/python -- $RHODECODE_ARGS
}

stop() {
    /sbin/start-stop-daemon \
        --stop \
        --user $USER
}

case "$1" in
    start)
        echo "Starting Celery"
        start_celery
        echo "Starting RhodeCode"
        start_rhodecode
        ;;
    stop)
        echo "Stopping RhodeCode and Celery"
        stop
        ;;
    restart)
        echo "Stopping RhodeCode and Celery"
        stop
        echo "Starting Celery"
        start_celery
        echo "Starting RhodeCode"
        start_rhodecode
        ;;
    *)
        exit 2
        ;;
esac

exit 0

Я ненавижу такие «ответы», но, похоже, я каким-то образом повредил эту установку, не осознавая этого. Я удалил весь виртуальный код RhodeCode и воссоздал его в соответствии с мои заметки, и теперь скрипт init.d работает правильно, когда я вызываю его через service rhodecode start.

Хотел бы я знать, что я сделал не так в первый раз.

Вы пробовали поставляемый скрипт init.d?

думаю --exec $DAEMON -- $DAEMON_OPTS часть отсутствует в вашем сценарии.

Я считаю, что вам не хватает чего-то для загрузки среды virtualenv. Я столкнулся с такими же проблемами с RVM Ruby, который похож на virtualenv. В соответствии с документами, которые вам понадобятся активировать в вашем сценарии.

Вам нужно добавить source $VENV_DIR/bin/activate в ваш скрипт перед выполнением команд. Когда вы запускаете его как собственный пользователь, вы, вероятно, уже активировали виртуальную среду.