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

これで行けた。

参考文献

[twitter:@max747] さんにアドバイス頂きました。ありがとうございます!!