Upstartってなんだ?

先日、UbuntuVMwareにインストールした時には特に気にしていませんでしたが、Fedora9のリリース記事をみてUpstartなるものが目に留まったので、ちょっと調べてみました。てかUbuntuのだと6.10の頃からUpstartが搭載されてたんですね。

Upstartとは

従来のinitデーモン(SysVinit)から置き換えられた、イベントベースのinitデーモン

initデーモンって?

全てのプロセスの親プロセス。psで確認するとPID=1。
/etc/inittabの設定に従って、/etc/rc*.d/のスクリプトを実行して、いろんなプロセスを立ち上げたりする。

結局、何が変わった?

  • /etc/inittabがなくなった。
  • ジョブの定義ファイル置き場は/etc/event.d/になった。
  • システムのイベントを捉えてジョブを実行できる。
  • そのうちcrondもこいつに置き換えられるらしい。

などなど。

とはいえ、まだまだ移行期でSysVinit互換に作成されているので、/etc/inittabがある場合はそちらが優先的に読み込まれるし、/etc/init.d/、/etc/rc*.d/のスクリプトも/etc/event.d/内の定義ファイルを通じて実行されているのねん。

/etc/inittabの代わりは

  • /etc/event.d/rc-default
# rc - runlevel compatibility
#
# This task guesses what the "default runlevel" should be and starts the
# appropriate script.

start on stopped rcS

script
	runlevel --reboot || true

	if grep -q -w -- "-s\|single\|S" /proc/cmdline; then
	    telinit S
	elif [ -r /etc/inittab ]; then
	    RL="$(sed -n -e "/^id:[0-9]*:initdefault:/{s/^id://;s/:.*//;p}" /etc/inittab || true)"
	    if [ -n "$RL" ]; then
		telinit $RL
	    else
		telinit 2
	    fi
	else
	    telinit 2
	fi
end script

デフォルトのランレベルを変更したい時は、このファイルを編集する。Ubuntuはデフォルトのランレベル2に設定されているので、elseの後のtelinitの引数を書き換えれば、起動時のランレベルを変更できる。
先に、/etc/inittabを読みに行ってるね。

script 〜 end script の間は/bin/sh(つまりは/bin/bash)で実行される。

ジョブ定義ファイルを作ってみる

  • /etc/event.d/rails_sample
# rails sample application with mongrel 

start on runlevel 2
start on runlevel 3
start on runlevel 4 
start on runlevel 5 

exec mongrel_rails start -d -c /railsapps/sample

サンプルなのでmongrelのオプションだとかの話はおいといて、やってる事はとてもシンプル。

  • start on
    • ジョブを起動させるランレベルを指定。(runlevel以外にも色々指定できる。)
  • exec
    • 実行するサービスを指定。

これでサーバの起動時に、mongrelrailsアプリケーションが起動される。

その他にも

  • pre-start script 〜 end script
  • post-stop script 〜 end script
  • console
  • respawn
  • その他もろもろ

などなど指定できるキーワードは色々あるようですが、そのへんは参考文献を。

こんな感じで割とシンプルな記述でいろいろな事が出来るようです。イベントもいろんな指定の仕方が出来るようだし、cron代わりに使用する方法なんかも、もうちょっと調べてみたいと思う次第です。