Rubyスクリプトをdaemonで起動する

Ruby逆引きレシピAdvent Calendar 参加企画ということで、4日目を担当します。


「ところでこの本って、いったい何の本なの、マイケル?」
「よく聞いてくれたね、ジェニファー!この本はRubyで何かをしたいときにまず目を通すといい本なんだよ!」
「あら、マイケル、そんなのgoogle先生に聞けばだいたいわかるんじゃないの?」
「おいおい、冗談言ってるんじゃないぜ、ジェニファー!Rubyには便利なライブラリがいっぱい揃ってるし、簡単にコードが書けるよな?」
「ええ、そうね。」
「だからこそ逆に『あれ、これ似たようなライブラリがいっぱいあるけど、どのライブラリ使うのが簡単なんだろう?』っていう時にとっても役に立つのさ!」
「まぁ、素敵!」
「しかも著者によるサンプルコードもついてるから、すぐにコードを試せるんだぜ!」
「あら、私も一冊ほしくなってきたわ。」
「それにこの本は幅広く役に立つことが書いてあるから、読み物としても面白いんだ。」
「初心者から上級者まで、必携の一冊ってことね!?」
「しかも今なら!一冊買うと、もう一冊欲しくなってくるキャンペーンを実施してるんだ。」
「これはもう、最寄の本屋で買うしかないわね!」


Ruby 逆引きレシピ すぐに美味しいサンプル&テクニック 232 (PROGRAMMER’S RECIPE)

Ruby 逆引きレシピ すぐに美味しいサンプル&テクニック 232 (PROGRAMMER’S RECIPE)


さて、このテンションに疲れてきたところで、レシピの62「スクリプトをデーモンとして動作させたい」を参考に実際にコードを試しみましょう!


まずはgemのインストール

$ gem install daemons

コードを書きます。

# reminder.rb
require "rubygems"
require "daemons"
require "net/smtp"

_, term, = ARGV
term = term.to_i

smtp_server = "smtp.example.com"
smtp_port   = 25
from        = "from@example.com"
to          = "to@example.com"

Daemons.run_proc(File.basename(__FILE__)) do
  loop do
    Net::SMTP.start(smtp_server, smtp_port) do |smtp|
      smtp.send_mail("Not forget me!!", from, to)
    end
    sleep term
  end
end

起動します。

$ ruby reminder.rb run 3600


「ことろでマイケル、このコードは何をするコードなの?」
「よく聞いてくれたね、ジェニファー!これは、女の子から教えてもらったメールアドレスに、1時間ごとにぼくのことを『忘れないでね♪』ってメールを送信するコードなのさ!」
「………。」
「これでもう、女の子と連絡が取れなくなくなることはないね!」
「そうね、マイケル。みんなあなたのことを忘れたんじゃなくて、忘れたかったんだと思うの。あなたは『Ruby逆引きレシピ』をもっと読んで、誰かの役に立つコードを書いたほうがいいわ。」


お求めはAmazon、もしくはお近くの書店で!

Ruby 逆引きレシピ すぐに美味しいサンプル&テクニック 232 (PROGRAMMER’S RECIPE)

Ruby 逆引きレシピ すぐに美味しいサンプル&テクニック 232 (PROGRAMMER’S RECIPE)