Python製Foremanクローンのhonchoを使ってみた

Foreman はProcfileベースのプロセス管理ライブラリで、 honcho はそのPythonポーティングです。

便利そうなので使ってみます。 honchoの最新リリースバージョンは0.4.0 です。

インストールから起動まで

インストール

$ pip install honcho

今回はbottle.pyを使ったWebアプリを2つ起動してみます。

# app.py
import sys
from bottle import run

def main():
    run(port=int(sys.argv[1]))

if __name__ == '__main__':
    main()
# Procfile
web1: python app.py 8081
web2: python app.py 8082

設定ファイルをチェックして起動してみます。

$ honcho check
INFO: Valid procfile detected (web1, web2)
$ honcho start
23:44:18 web1.1 | started with pid 7117
23:44:18 web2.1 | started with pid 7118
23:44:18 web1.1 | Bottle v0.11.6 server starting up (using WSGIRefServer())...
23:44:18 web1.1 | Listening on http://127.0.0.1:8081/
23:44:18 web1.1 | Hit Ctrl-C to quit.

23:44:18 web2.1 | Bottle v0.11.6 server starting up (using WSGIRefServer())...
23:44:18 web2.1 | Listening on http://127.0.0.1:8082/
23:44:18 web2.1 | Hit Ctrl-C to quit.

^CSIGINT received
23:44:20 system | sending SIGTERM to all processes
23:44:20 system | sending SIGTERM to pid 7118
23:44:20 web1.1 | process terminated
23:44:20 web2.1 | process terminated

設定ファイルのエクスポートは upstart にしか対応してないみたいです。

$ honcho export upstart .
$ ls -ltr
-rw-r--r-- 1 root root 328 May  8 19:38 testhoncho.conf
-rw-r--r-- 1 root root  56 May  8 19:38 testhoncho-web2.conf
-rw-r--r-- 1 root root 213 May  8 19:38 testhoncho-web2-1.conf
-rw-r--r-- 1 root root  56 May  8 19:38 testhoncho-web1.conf
-rw-r--r-- 1 root root 213 May  8 19:38 testhoncho-web1-1.conf
$ honcho export inittab .
usage: honcho export [-h] [-e ENV] [-d APP_ROOT] [-f PROCFILE] [-s SHELL]
                     [-u USER] [-c process=num,process=num] [-p N] [-l DIR]
                     [-a APP]
                     FORMAT LOCATION
honcho export: error: argument FORMAT: invalid choice: 'inittab' (choose from 'upstart')

Supervisord用の設定ファイルをエクスポートする

upstart にしか対応していないと思いきや、 GitHubリポジトリをみるとSupervisordに対応しているではありませんか!!

以下のような感じで導入できます。

$ pip install --upgrade git+git://github.com/nickstenning/honcho.git
$ honcho export supervisord -a fooapp dummydir
$ cat dummydir/app.conf
[program:fooapp-web1]
command=python app.py 8081
autostart=true
autorestart=true
stopsignal=QUIT
stdout_logfile=/var/log/fooapp/web1-1.log
stderr_logfile=/var/log/fooapp/web1-1.error.log
user=root
directory=/home/hattori/tmpapp
environment=PORT="5000"
[program:fooapp-web2]
command=python app.py 8082
autostart=true
autorestart=true
stopsignal=QUIT
stdout_logfile=/var/log/fooapp/web2-1.log
stderr_logfile=/var/log/fooapp/web2-1.error.log
user=root
directory=/home/hattori/tmpapp
environment=PORT="5100"

[group:fooapp]
programs=fooapp-web1,fooapp-web2

設定ファイルが作成されるので、 所定のディレクトリに置いてリロードすればOK。

$ cp -p dummydir/fooapp.conf /etc/supervisor/conf.d/
$ supervisorctl reload

いいですね。 パイロット段階では honcho start 使って、 恒久的に動かしたくなったらsupervisord用の設定ファイルを書き出して、 supervisordから起動すればOKと。

Zsh補完関数

あとネタがないので、 honchoのZsh補完関数 書いてみました。 よかったら使ってみてください。

ちなみに

foremanもhonchoも 管理者 みたいな意味なんですね。