Railsで、Daemonを動かすためのメモです。
今回はdaemon-spawn
というgemを使いました。
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秒毎に現在時刻の書き込みできている事が分かります。
もし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