Upstart を使ってお手軽 daemon 化

こんにちは。斎藤です。

手元でちょちょいと作ったプログラムや、 init スクリプトの無いOSSを daemon として動作させ続けたい事、ありませんか?そんなときに便利なのが Upstart です。daemontoolsの代わりとしても使えます。

今回は設定方法を中心に、解説していきます。

※CentOS 6.3 (x86_64) で検証しています

はじめに

Upstart とは何か

UpstartのWikiによると、"/sbin/init"デーモン(例えばSysVinit)を置き換えるものであり、イベントベースでタスクやサービスを起動・停止できるようにしたものである、と述べられています。また、特徴として、SysVinitと比べ「設定が簡単」「起動が早くなる」などが挙げられています。

Upstart のメリット

3つのメリットがあると、私は考えています。

  • 起動・終了制御が容易
  • 仮にABENDしても Upstart が再始動してくれる
  • initスクリプトをがんばって書かなくてもよい

そうそう、"/etc/rc.local"に起動コマンドを書いてとりあえず daemon 化してしまっている人、いかがですか?

利用できる環境

  • RHEL/CentOS 6.0 以降
  • Debian/GNU Linux 6.0 (Squeeze) 以降
  • Ubuntu 9.10 以降 (設定を行えばUbuntu 6.10 以降)
  • openSUSE 12.1 以降

利用可能かを簡単に見分ける方法は、「OSの起動が以前に比べて劇早」であることです。

設定してみよう

準備

各自でデーモン化したいプログラムを用意します。今回の説明では、CTOの馬場が開発した "yaoyacontrib-webif" を"/usr/loca/yaoyacontrib-webif"にインストールし、利用します。"yaoyacontrib-webif"は、インベントリ収集ツールが集めてきた情報を表示するWebインタフェースです。詳細については「Slideshare - nouka inventory manager」をご覧ください。

設定は簡単!

ファイル1つだけで設定できます。最も簡単な書式を示します。


description "(説明を書く)"
author  "(あなたの名前) <(メアド@ドメイン)>"

start on runlevel [(Run Level)]
stop on runlevel [(Run Level)]

chdir (作業ディレクトリ)
exec (起動コマンド)
respawn

init スクリプトを書くより、楽でしょう?では、実際の設定例を示します。


$ cat /etc/init/yaoyacontrib-webif.conf 
description "yaoyacontrib-webif"
author  "Yuichiro SAITO <username@hostname.domain.tld>"

start on runlevel [2345]
stop on runlevel [016]

chdir /usr/local/yaoyacontrib-webif
exec python yaoya_webif/application.py >> /var/log/yaoyacontrib-webif.log 2>&1
respawn

設定を反映します。


$ sudo initctl reload-configuration
$ sudo initctl list | grep yaoyacontrib-webif
(※"yaoyacontrib-webif stop/waiting" と出ていればOK)

これでおしまいです。

起動方法

起動は次の通りです。


$ sudo initctl start yaoyacontrib-webif
yaoyacontrib-webif start/running, process 18666
$ sudo initctl list | grep yaoyacontrib-webif
yaoyacontrib-webif start/running, process 18666
$ ps auxwwf | grep 18666
root     18666  7.2  1.5 117096 15684 ?        Ss   12:12   0:00 python yaoya_webif/application.py
root     18671 11.3  1.5 192928 16048 ?        Sl   12:12   0:00  \_ /usr/bin/python yaoya_webif/application.py

問題なく起動しました。もし、プロセスがあがっていないときは"/var/log/messages"を確認してください。エラーメッセージが出力されているときがあります。

試しにプロセスをkillしてみましょう。


$ ps auxwwf | grep 18666
root     18666  7.2  1.5 117096 15684 ?        Ss   12:12   0:00 python yaoya_webif/application.py
root     18671 11.3  1.5 192928 16048 ?        Sl   12:12   0:00  \_ /usr/bin/python yaoya_webif/application.py
$ sudo kill 18671
$ sudo initctl list | grep yaoyacontrib-webif
yaoyacontrib-webif start/running, process 18681
$ ps auxwwf | grep python
root     18681  1.6  1.5 117100 15692 ?        Ss   12:12   0:00 python yaoya_webif/application.py
root     18686  2.2  1.5 192928 16048 ?        Sl   12:12   0:00  \_ /usr/bin/python yaoya_webif/application.py

再びあがってきていますね。これで、不用意に停止する問題のほとんどを回避できます。

停止

停止も簡単です。


$ sudo initctl stop yaoyacontrib-webif
yaoyacontrib-webif stop/waiting
$ sudo initctl list | grep yaoyacontrib-webif
yaoyacontrib-webif stop/waiting
$ ps auxwwf | grep python
(※pythonのプロセスが無い事を確認)

その他

よく使いそうなコマンドを挙げます。

  • initctl check-config: 設定ファイルのチェック
  • initctl reload: kill -HUP します
  • initctl restart: 再起動します

がんばりたい人に

初期化処理や終了処理に便利な"pre-start","post-stop"などのシェルスクリプトを記述する事もできます。また、起動順の制御も可能です。

また、respawn(死んだプロセスの再起動)については、当社 滝澤のスライドをご覧頂くと理解が深まります。

更なる詳細は「参考文献」に挙げている公式ドキュメントをご覧ください。

 おわりに

Upstart を利用すると、手軽かつ堅牢にプログラムを daemon 化できます。デバッグや一時的な環境構築にはもちろん、それほど複雑な起動シーケンスを要しない場合に便利です。ぜひ、お試しください。

それでは、ごきげんよう。

参考文献