Upstartを使う

最近、デーモンプロセスの管理に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

これでデーモンとして実行してくれる。プロセスが死んだ場合も、自動的に再起動される。