しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Rails runnerをDaemonで動かすGem、daemon-spawn

Railsで、Daemonを動かすためのメモです。
今回はdaemon-spawnというgemを使いました。

github.com

Bundlerでインストールします。
requireはdaemon_spawnにする必要があるので下のように書きます。

gem 'daemon-spawn', require: 'daemon_spawn'

使い方としては、Daemon用のクラスを作って実行するだけです。

Daemonクラスは下のようにDaemonSpawn::Baseを継承したものを作ります。 クラスのstartメソッドにDaemonとして実行したい処理を書きます。

そのファイルの最後にDaemonを実行するspawnメソッドを追加します。

class MyDaemon < DaemonSpawn::Base
  def start(args)
    loop do
      Rails.logger.info(Time.current)
      sleep 1
    end
  end
end

MyDaemon.spawn!(
    working_dir: Rails.root,
    pid_file: "#{Rails.root}/tmp/my_daemon.pid",
    log_file: "#{Rails.root}/log/my_daemon.log",
  )

クラスを追加したら下のように実行します。
これで処理のDaemon化が完了です。

rails r lib/my_daemon.rb start &

ログを見ると、1秒毎に現在時刻の書き込みできている事が分かります。

f:id:llcc:20180426100830p:plain

もしstart内のloopがない場合、Daemonは処理を終えたタイミングで終了します。

class MyDaemon < DaemonSpawn::Base
  def start(args)
    Rails.logger.info(Time.current)
  end
end

その後にstop処理をすると下のようなエラーになります。

PID file found, but process was not running. The daemon may have died.

Daemonの停止は下コマンドで行います。

rails r lib/my_daemon.rb stop