Supervisord + Virtualenv な環境で gunicorn を起動する
Supervisord で gunicorn のプロセス管理をしていて、今までは以下のように人間が virtualenv を起動して supervisorctl を叩いていた。
$ workon project $ supervisorctl start project
Linux マシンを起動したら自動的に Supervisord が起動して、gunicorn も起動するという事がやりたかった。
gunicorn はシステムの Python の環境には入ってなくて virutalenv(virtualenvwrapper) で環境構築をしている。
検索した結果 Activating a virtualenv in supervisord - Parente's Mindtrove な方法でいけた。
ラッパー用のシェルスクリプト
#!/bin/sh VENV=$1 echo $VENV if [ -z $VENV ]; then echo "usage: runinenv [virtualenv_path] CMDS" exit 1 fi . ${VENV}/bin/activate shift 1 echo "Executing $@ in ${VENV}"exec "$@"
/etc/supervisord.conf
[program:foo] command=sh /opt/local/projects/foo/data/runinenv /home/bar/.virtualenvs/foo python /home/bar/.virtualenvs/foo/bin/gunicorn -c /opt/local/projects/foo/data/gunicorn.production.conf.py manage:app directory=/opt/local/projects/foo autostart=true autorestart=true redirect_stderr=true stdout_logfile=/opt/local/projects/foo/logs/foo_stdout.log stderr_logfile=/opt/local/projects/foo/logs/foo_stderr.log
/etc/init.d/supervisord
. /etc/rc.d/init.d/functions SUPERVISORD="/usr/bin/supervisord" PIDFILE="/var/run/supervisord.pid" start() { if [ ! -x "$SUPERVISORD" ]; then echo "$SUPERVISORD is not executable." exit 1 fi $SUPERVISORD --pidfile $PIDFILE return $? } stop() { echo "Stopping ..." kill -QUIT `cat $PIDFILE` [ $? -eq 0 ] && rm -f $PIDFILE return $retval} case $1 in start) start ;; stop) stop ;; *) echo "$0 start|srop" exit 2 ;; esac
$ sudo /etc/init.d/supervisord start
これで行けた。