Supervisor でプログラムをデーモン化

k8s を使っていない systemd も入っていない。 そんな古い環境でプロセスをデーモンとして常駐させたくなる時がある。 そんな時はPython製のSupervisordを突っ込むのが便利だと思っている。 類似ツールで有名なのにdaemontoolsもあるけど、あれよりも扱いが楽だし開発が継続している。

3系を初めて触ったら読み込み対象の設定ファイルが /etc/supervisor/conf.d/*.conf に変わっていた。 ログローテーションを含めて下のように設定する。

numprocs > 1 で利用する場合はprocess_name%(process_num) に相当する文字列が入っていないといけない。 簡単だけど、失敗時のログとか綺麗に出してくれないので commandcat にしたり which python にしたりしながら進めないとならなくなったりする。

 1 2 3 4 5 6 7 8 9101112131415161718
[program:apple]
process_name=%(program_name)s_%(process_num)02d
numprocs=2

command=/usr/bin/python /home/apple/local/bin/worker.py
directory=/home/apple
user=apple
environment=ENV="production",PATH="/usr/bin:/usr/local/bin"

autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
stopsignal=QUIT

stdout_logfile=/home/apple/log/apple-service.stdout.log
stdout_logfile_maxbytes=200MB
stdout_logfile_backups=7

インストールは pip でできるけど、 apt-get などシステムのパッケージマネージャを使った方が Supervisord 自体のサービス化がされているので楽。

comments powered by Disqus