There's an echo in my head

日々のメモ。

rubotyをデーモンとして動かす

Herokuで動かしてたりdockerでデプロイしてたりするとあまり旨味はないのかもしれないけど、普通にcapistranoでデプロイして動かしたいようなときもあるのでやってみた。

下記のスクリプトを例えばyour_ruboty/lib/daemonize.rbみたいな場所に置いておく。

# nochdir: true   - 相対パスでファイルの読み込みをするプラグインがあったときに
#                   不具合の出ないように
# noclose: false  - capistranoでデプロイしたときに制御端末を切り離すために
Process.daemon(true, false)

# killしやすいようにPIDを書き出す
require "fileutils"
pid = File.expand_path("/tmp/ruboty.pid", __FILE__)
FileUtils.mkdir_p(File.dirname(pid))
File.open(pid, "w") { |f| f.write Process.pid }

そして起動時に--loadオプションで上記のスクリプトを指定して読み込んでやればデーモンとして動いてくれる。

$ bundle exec ruboty --dotenv --load lib/daemonize.rb

killしたいときはPIDファイルを見て適当にシグナルを送ってやればいい。

$ kill -TERM $(cat /tmp/ruboty.pid)

追記

PIDファイルデーモン化のオプションがそれぞれ本体に取り込まれたので、追々上記のようなことは不要になる。

追々記

ruboty 1.3.0から--daemonオプションと--pid <path>オプションが導入された。

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。