我正在尝试在 Ubuntu 12.04 上设置 RhodeCode 服务器。我已将所有内容安装到虚拟环境中,当我从控制台 ( paster serve production.ini
) 运行它时,一切都正常运行。
我编写了一个 init.d 脚本来在启动时启动它,但它似乎不起作用。当我sudo /etc/init.d/rhodecode start
手动执行时,我看到“Starting RhodeCode”回显到控制台,一切正常。但是,如果我重新启动,或者如果我使用sudo service rhodecode start
,我确实会看到消息回显到控制台,但 Python 进程没有运行。
我已经使用 安装了脚本update-rc.d rhodecode defaults
。
source /usr/rhode/venv
通过研究如何实现这一点,我发现的资料表明,如果我直接从虚拟环境目录运行 python,则无需运行。无需先激活任何虚拟环境即可从控制台成功运行此操作似乎支持这一理论。virtualenv 页面似乎证实了这一点:
如果您直接从virtualenv的bin /目录运行脚本或python解释器(例如path / to / env / bin / pip或/path / to / env / bin / python script.py),则无需激活。
有关如何设置服务器的更多详细信息,此 Gist 显示了我迄今为止所做工作的记录:在 Ubuntu Server 12.04 上安装 RhodeCode 1.3.6
/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
答案1
您是否尝试过提供的 init.d 脚本?
我认为--exec $DAEMON -- $DAEMON_OPTS
你的脚本缺少一部分。
答案2
我讨厌这种“答案”,但似乎我一定是在不知不觉中损坏了那个安装。我删除了整个 RhodeCode 虚拟环境,并根据以下说明重新创建了它:我的笔记,现在当我通过 调用它时,init.d 脚本可以正常工作service rhodecode start
。
我希望我第一次就知道我做错了什么。
答案3
我认为您缺少的是加载虚拟环境所需的东西。我遇到过与虚拟环境类似的 Ruby RVM 的相同问题。根据文档,您需要使用启用在你的脚本中。
答案4
您需要source $VENV_DIR/bin/activate
在执行命令之前将其添加到脚本中。当您以自己的用户身份运行它时,您可能已经激活了虚拟环境。