この記事は1年以上前に投稿された記事で現在は正しい情報とは限りません。

Ubuntuとかでnginxのinitscript見るとstart-stop-daemon使ってデーモン化していて、デーモン化する手段として覚えておいた方が良さそうだなーと思ったので触ってみました。

以下、(俺が)挙動を理解する用のサンプル

  • –start:起動するときに使用
  • –stop:停止するときに使用
  • –background:デーモン化しないプログラムを実行するとき(フォアグラウンドプロセス)につける。これを指定するとforkしたりデーモン化するときのあれこれをやってくれる。
  • –exec:実行するプログラム(–startasでもOK)
  • –make-pidfile:start時にPIDファイルを生成するかどうかを指定(プログラム内で生成するのであれば指定しない)。stop時には自動的にPIDファイルを削除してくれないので自前でrmすることに注意する。
  • –pidfile:PIDファイルのパスを指定
  • –の後ろ:プログラムの引数

–quiteしないで二重起動しようとすると

起動していないのに停止しようとすると

とメッセージが出力されます。

また、対象のPIDのプロセスが既に立ち上がってるかどうかは以下で確認可能です(戻り値が0であれば既に立ち上がっている状態)

以下の”標準出力をログに出力したい場合”でexec使う場合は、/bin/bashとexec先のプログラムが異なるので、startするたびに別のプロセスが生成されてしまいます。その場合は、上記コマンドを使って事前チェックで弾くか、–execではなく–startasを引数に利用することで二重起動を回避可能です(詳細は後述)。

標準出力をログファイルに出力したい場合

以下のようにして標準出力をするためにexec+リダイレクトしてあげればOK。

デーモンはプロセスが端末と切り離されているので、通常のスクリプト実行とは挙動が異なる可能性があることに注意する必要があります。たとえばPythonだと通常のスクリプト実行と違い、標準出力やファイル出力がデフォルトでブロックバッファになります。

明示的に行バッファにするには

とするか、スクリプト内で明示的に行バッファを指定してファイル書き出しなどをすれば良いです。

Pythonの場合は、

とすればファイル書き出しは行バッファになり、標準出力の場合も色々と方法はあるみたいです。

–exec vs –startas

executableなscriptをデーモン化するときや、上記の標準出力をログファイルに出力するためにexecするようなケースにおいて、–execだと冪等性が確保できない(2回起動したら2つインスタンスが作成される)ので、startasを使うようです。startasはPIDだけで起動有無を確認する仕様らしいです。

start-stop-daemon: –exec vs –startas – Chris Lamb

その他メモ

対象のPIDのプロセスがあるかどうかを確認

実プロセスと実際のコマンドが有っているかの確認

おまけ(Upstart)

まぁこんな苦労しなくてもUpstart使えば一発です。

参考URL