最近、デーモンプロセスの管理にUpstartを使ってる。
PIDの管理をあんまり気にしなくてよかったり、イベント発火の仕組みでプロセス間の依存を解決できるのが楽。
簡単な使い方をメモしておく。
基本的な使い方
- /etc/init/ に設定ファイルを設置する
- initctlコマンドで操作する
これだけ。
操作用のコマンド
プロセスの開始/終了/再起動/リロードは、start/stop/restart/reloadコマンドを使う。
$ sudo start myapp $ sudo stop myapp $ sudo restart myapp $ sudo reload myapp
これらは、initctlコマンドへのシンボリックリンクで、例えばstartなら、
$ sudo initctl start myapp
と同等になる。
restartは終了して開始、reloadはkill -HUPシグナルの送信になる。
動かしてみる
Hello world!を返すだけのHTTPサーバーをUpstartで動かしてみる。
/var/myapp/myapp.py
まずは対象のアプリケーションの用意。Pythonのスクリプトだけど、どこに置いてもいい。
from wsgiref.simple_server import make_server def myapp(environ,start_response): start_response("200 OK", [('Content-Type','text/plain')]) return ["Hello world!"] def main(): httpd = make_server('', 8000, myapp) httpd.serve_forever() if __name__ == '__main__': main()
/etc/init/myapp.conf
Upstartの設定ファイル。
description "My Application" start on runlevel [2345] stop on runlevel [!2345] respawn umask 022 script exec python /var/myapp/myapp.py end script
ランレベル2345の場合に開始、それ以外の場合は停止する。
execで実行してプロセスを1つにしておかないと、Upstartの監視対象にならないので注意する。
特定のユーザーでプロセスを実行する場合は、sudoやstart-stop-daemonを組み合わせて使う。
起動する
$ sudo start myapp myapp start/running, process 44986
これでデーモンとして実行してくれる。プロセスが死んだ場合も、自動的に再起動される。