我正在尝试在 Ubuntu 12.04 上设置 RhodeCode 服务器。我已将所有内容安装到 virtualenv 中,当我从控制台 ( 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
通过研究如何实现这一点,我发现的资源表明,如果我直接从 virtualenv 目录运行 python,则不需要运行。在没有激活任何 virtualenv 的情况下从控制台成功运行它似乎支持这个理论。virtualenv 页面似乎证实了这一点:
如果您直接从 virtualenv 的 bin/ 目录(例如 path/to/env/bin/pip 或 /path/to/env/bin/python script.py)运行脚本或 python 解释器,则不需要激活。
有关我如何设置服务器的更多详细信息,此要点显示了我到目前为止所做的笔记:在 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
您是否尝试过提供的 init.d 脚本?
我认为
--exec $DAEMON -- $DAEMON_OPTS
您的脚本中缺少一部分。我讨厌这种“答案”,但似乎我一定是在不知不觉中以某种方式损坏了那个安装。我删除了整个 RhodeCode virtualenv 并根据我的笔记重新创建它,现在当我通过调用它时 init.d 脚本可以正常工作
service rhodecode start
。我希望我知道我第一次做错了什么。
我相信你缺少的是加载 virtualenv 环境的东西。我遇到了与 virtualenv 类似的 Ruby 的 RVM 的相同类型的问题。根据您需要在脚本中使用activate的文档。
您需要
source $VENV_DIR/bin/activate
在执行命令之前添加到脚本中。当您以自己的用户身份运行它时,您可能已经激活了虚拟环境。