limitusus’s diary

主に技術のことを書きます

この時代に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がマージされたように見える。

bugs.launchpad.net

また、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を書くのが一般的だと思う。昔書いた。

github.com

もしかしたら 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が出ているが、スルーされている。

bugs.launchpad.net