読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

プログラムをdaemonにする。

Ruby

rubyプログラムをdaemonとして実行する方法について。

deamon化の手順

deamon化の手順については「PC覚え書き-プログラムのデーモン化」の解説が詳しい。ポイントは次の通りです。

  1. 子プロセスの生成
    • fork関数を実行して子プロセスを生成し、親プロセスを終了させる。
      • これにより、プロセスはinitプロセスグループに属するプロセスになる。
      • 次に行うsetsidは、プロセスグループリーダーで行うと失敗するので、この処理を行ってプロセスリーダーでない状態にしておく。
  2. セッションの新規作成と割り当て
      • Process.setsid関数を実行し、新規にセッションを開始して割り当てる。
  3. 子プロセスの再生成
    • fork関数を再度実行して、initプロセスグループに属するプロセスにする。
    • こうすると制御端末を設定することができなくなってよいらしい。
    • デバッグモード等で制御端末が必要な場合は実行しない。
  4. カレントディレクトリの移動
    • プロセスのカレントディレクトリを"/"に移動する
    • これを怠ると、「deamonのカレントディレクトリであるために管理者が操作できない」といったことが起こるとのこと。
    • "./foo"とかの相対パスでファイルを扱っていると、カレントディレクトリ変更後に問題になったりするので注意。
  5. umaskの設定
    • プログラムのumaskは元の設定を継承しており、何が設定されているか不定なため、再設定しておく。
  6. 標準入出力・エラー出力のクローズ
    • 親プロセスから引き継がれており、どこにリダイレクトされるかわからないため、一旦閉じる。
  7. 標準入出力・エラー出力の設定
    • 必要に応じて、deamonが使う標準入出力・エラー出力を再設定する。

rubyプログラムをdaemon化する

rubyプログラムをdaemon化する簡単な方法としては、以下があるようです。(via.koziyの日記 - 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


参考: