この時代にupstartに関する知見をいくつかまとめておく
背景
なぜSysVinitからupstart、さらにsystemdへと進化が進んでいる中、upstartなのかという疑問が当然ありますが、理由は簡単で最近Amazon Linuxを使っているため。
Amazon LinuxはCentOS6ベースで構築されており、入っているのはsystemdではなくupstartなので。
一次情報
Upstart Intro, Cookbook and Best Practises
これが最も詳しい資料だと思う。膨大。特に具体的な設定に関するところはConfiguration を読むのがよい。
知見
落ちたら勝手に上げる
respawn
これでOK
必ずforegroundで上げる
backgroudに行くと当然upstartから見たら死んだと見做されてしまう。1回上げてそれっきりのものならよいが、OS起動時の処理くらいしかそういうケースはない気がする。
root以外で起動する
いわゆるsetuid/setgidしたいとき。
ドキュメントにはsetuid,setgidが記載されていて、これが使える。ただしsupplementary groupには対応していない。こんな風に書くことになる。
setuid zabbix setgid zabbix
supplementary groupの対応はfeature requestとして上がっていて、patchがマージされたように見える。
また、setuid,setgidはv1.4からの追加stanzaで、Amazon Linuxにインストールされているv0.6.5では利用できない。
したがって、supplementary groupもセットしたいか、v1.4以前のupstartを使っている場合は自前でsetuid/setgidするwrapperをかませてあげる必要あある。
supplementary groupが必要なければたとえばdaemontoolsのsetuidgidを利用すればよい。
supplementary groupも必要な場合、自前でwrapperを書くのが一般的だと思う。昔書いた。
もしかしたら su(1) を使うだけでいいのかもしれない。未検証。
変数を利用する
env, export というstanzaがある。基本的にはenvを利用する。exportはさらに別のeventを駆動したとき、そちらにも変数を渡したい場合に利用するらしい(やったことはない)
これにより変数を定義しておき、後続のスクリプト実行などで利用することができる。
env DIR=/path/to/app exec setuidgroups app_user $DIR/run post-stop script rm -rf $DIR/temp/* end script
stanzaの引数では変数が使えない
たとえばchdirはstanzaであり、ここでは変数が使えない。したがってこのようには書けない。
env DIR=/path/to/app chdir $DIR exec ...
こちらもfeature requestが出ているが、スルーされている。