Я пытаюсь настроить сервер 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
#!/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
в ваш скрипт перед выполнением команд. Когда вы запускаете его как собственный пользователь, вы, вероятно, уже активировали виртуальную среду.