こんにちは。斎藤です。
手元でちょちょいと作ったプログラムや、 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 化できます。デバッグや一時的な環境構築にはもちろん、それほど複雑な起動シーケンスを要しない場合に便利です。ぜひ、お試しください。
それでは、ごきげんよう。
参考文献
- Upstart Intro, Cookbook and Best Practises
- 日経Linux - 2011年2月号 【応用講座 CentOS 6を先取りチェック(第2回) initデーモン「Upstart」とメールサーバー「Dovecot」】 (当社 滝澤の記事です)
- initとプロセス再起動 (当社 滝澤のスライドです)
- nouka inventory manager (当社CTO 馬場のスライドです)