今作っている rails アプリのプロセス管理を god (github) にしてもらいたいと思って神と戯れた。
god を利用することで unicorn プロセスも woker (serverengine を使用) プロセスもまとめて起動したり、まとめて閉じたりできる(はず)。今回はそれに加えて、god にログローテーションを任せたい(daemontools の multilog のように)と思って奮闘したメモ。
戦略
上の戦略でイケるかと思ったが、結論としてはダメだった。god はどうやら、管理するプロセスをフォアグラウンドで起動させた場合には w.stop および w.restart が使えないらしく、w.stop, w.restart を使って上記 4. で保存した pid に kill コマンドでシグナルを送ろうと思っていたのに、それができなかった。
以下、未来の自分のためにメモを残しておく。god の癖メモ
god を利用することで unicorn プロセスも woker (serverengine を使用) プロセスもまとめて起動したり、まとめて閉じたりできる(はず)。今回はそれに加えて、god にログローテーションを任せたい(daemontools の multilog のように)と思って奮闘したメモ。
戦略
- god の Logger にログローテーション機能を追加. @todo: God::SimpleLogger を ruby の標準 Logger で再実装して shift_age オプションなどを使えばできそう
- w.log を使用すると起動するプロセスの STDOUT をキャプチャーして god の Logger がログファイルに書き込んでくれるようなので使う
- そのために unicorn および serverengine が STDOUT にログを吐くようにする
- (unicorn) 設定ファイルの stderr_path および stdout_path に何も指定せずにフォアグラウンドで動かすと STDOUT に出る。バックグラウンドで起動すると /dev/null に捨てられる
- (serverengine) オプションの :log に '-' を指定すると STDOUT に出せる。こちらもやはりバックグラウンドで動かすと /dev/null に捨てられる。
- god が kill でシグナルを送れるように unicorn および serverengine の pid をファイルに保存する
- (unicron) 設定ファイルの pid で指定できる. フォアグラウンドでもバックグラウンドでも出せる
- (serverengine) オプションの :pid_path で指定できる. バックグラウンドでないと出力されない。@todo: フォアグラウンドでも出力できるようにいじる(いじった)
上の戦略でイケるかと思ったが、結論としてはダメだった。god はどうやら、管理するプロセスをフォアグラウンドで起動させた場合には w.stop および w.restart が使えないらしく、w.stop, w.restart を使って上記 4. で保存した pid に kill コマンドでシグナルを送ろうと思っていたのに、それができなかった。
以下、未来の自分のためにメモを残しておく。god の癖メモ
- w.start でプロセスをデーモン起動させないと w.stop および w.restart が使えない
- フォアグラウンドじゃないと w.log 使えない
- フォアグラウンドで起動したプロセスにはデフォルトでは TERM を送る。変えたいときは w.stop_signal = 'QUIT' で変えられるが、w.restart_signal はないので リスタートシグナルを変えられない
- w.start = "cd /full/path/to && ruby hoge.rb" のようにした場合、stop シグナルがこれを起動する sh プロセスに送られてしまい、ruby プロセスにシグナルが送られない. w.start = "ruby /full/path/to/hoge.rb" なら OK
- god start -D でフォアグラウンド起動して、他の端末から god stop [task] とか送ると(多少)捗る
- god stop [task] した場合に w.stop が発動していれば何かしら god のログに出る。なにも出ない場合は、今回のように何も処理していないと判断してよい。
- god 自体のログは -l オプションでパスを指定すると syslog からファイル出力に切り替えられるが、logrotate の機能などはない