プログラムをdaemonにする。
rubyプログラムをdaemonとして実行する方法について。
deamon化の手順
deamon化の手順については「PC覚え書き-プログラムのデーモン化」の解説が詳しい。ポイントは次の通りです。
- 子プロセスの生成
- fork関数を実行して子プロセスを生成し、親プロセスを終了させる。
- これにより、プロセスはinitプロセスグループに属するプロセスになる。
- 次に行うsetsidは、プロセスグループリーダーで行うと失敗するので、この処理を行ってプロセスリーダーでない状態にしておく。
- fork関数を実行して子プロセスを生成し、親プロセスを終了させる。
- セッションの新規作成と割り当て
-
- Process.setsid関数を実行し、新規にセッションを開始して割り当てる。
-
- 子プロセスの再生成
- fork関数を再度実行して、initプロセスグループに属するプロセスにする。
- こうすると制御端末を設定することができなくなってよいらしい。
- デバッグモード等で制御端末が必要な場合は実行しない。
- カレントディレクトリの移動
- プロセスのカレントディレクトリを"/"に移動する
- これを怠ると、「deamonのカレントディレクトリであるために管理者が操作できない」といったことが起こるとのこと。
- "./foo"とかの相対パスでファイルを扱っていると、カレントディレクトリ変更後に問題になったりするので注意。
- umaskの設定
- プログラムのumaskは元の設定を継承しており、何が設定されているか不定なため、再設定しておく。
- 標準入出力・エラー出力のクローズ
- 親プロセスから引き継がれており、どこにリダイレクトされるかわからないため、一旦閉じる。
- 標準入出力・エラー出力の設定
- 必要に応じて、deamonが使う標準入出力・エラー出力を再設定する。
rubyプログラムをdaemon化する
rubyプログラムをdaemon化する簡単な方法としては、以下があるようです。(via.koziyの日記 - Daemonize)
- 組み込みモジュールのProcess.daemonを使う
- ruby1.9以降が必要。1.8以前では使えません。
- 添付モジュールのWEBrick::Daemon.startを使う
- Daemonizeを使う
以下はWEBrick::Daemon.startを使ったサンプル(daemon.rb)です。
require 'webrick' # ブロックをdaemonとして実行。 WEBrick::Daemon.start { loop { puts "test" sleep 5 } }
実行して、
$ ruby daemon.rb
psで見てみると、制御端末(tty)が割り当たってないのがわかります。
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND xxxx 25477 0.0 1.2 6880 3292 ? S 13:11 0:00 ruby daemon.rb
参考: