Godでプロセスが落ちたときにgmailで通知する方法
書いたコードをデーモンとして動かすときに、手抜きしてnohupでバックジョブに投げていたんですが、id:kenkitiiさんに 「rubyにGodという便利なものがあるよ」と教えてくれました。
このGodってどういうもの?
- 通常のプログラムをデーモンとして動かせます。
- 設定をrubyで記述します。
- 色々な機能が付いてたりもします。
で、使ってみたら便利すぎてびびりました。
とりあえずプロセスが落ちたときのメール通知をgmail経由にしたかったので、対応できるようにしてみました。
サンプルコード 'test.rb' を作成
ただカウントだけのゴミコードです。
n = 0 while true puts (n += 1) sleep 1 end
godで読み込む設定ファイル 'test.god' を作成
require 'tlsmail' module God module Contacts class Email < Contact def notify_smtp(mail) args = [Email.server_settings[:address], Email.server_settings[:port]] if Email.server_settings[:authentication] args << Email.server_settings[:domain] args << Email.server_settings[:user_name] args << Email.server_settings[:password] args << Email.server_settings[:authentication] end Net::SMTP.enable_tls(OpenSSL::SSL::VERIFY_NONE) Net::SMTP.start(*args) do |smtp| smtp.send_message mail, Email.message_settings[:from], self.email end end end end end God::Contacts::Email.message_settings = { :from => 'example@gmail.com' } God::Contacts::Email.server_settings = { :address => "smtp.gmail.com", :port => 587, :domain => "gmail.com", :authentication => :plain, :user_name => "example", :password => "mypassword", } God.contact(:email) do |c| c.name = 'alert' c.email = 'example@gmail.com' end God.watch do |w| w.name = "test" w.interval = 3.seconds w.start = 'ruby ' + "/tmp/" + 'x.rb' w.start_if do |start| start.condition(:process_running) do |c| c.running = false c.notify = 'alert' end end end
god経由でtest.rbを起動
-D をつけるとコンソールに経過を表示します。
$ god -c test.god -D I [2010-02-16 23:36:11] INFO: Loading test.god I [2010-02-16 23:36:11] INFO: Using pid file directory: /home/myhome/.god/pids I [2010-02-16 23:36:11] INFO: Started on drbunix:///tmp/god.17165.sock I [2010-02-16 23:36:11] INFO: test move 'unmonitored' to 'up' I [2010-02-16 23:36:11] INFO: test moved 'unmonitored' to 'up' I [2010-02-16 23:36:11] INFO: test [ok] process is running (ProcessRunning))
起動したtest.rbプロセスをkill
$ ps -ef| grep test.rb 2818 1 0 23:35 ? 00:00:00 ruby /tmp/test.rb $ kill 2818
godはプロセスが落ちたことを検知
検知してメールで通知して、プロセスを再度起動してくれています。
I [2010-02-16 23:36:53] INFO: test [ok] process is running (ProcessRunning) I [2010-02-16 23:36:56] INFO: test [trigger] process is not running (ProcessRunning) I [2010-02-16 23:37:00] INFO: test sent email to example@gmail.com (Email) I [2010-02-16 23:37:00] INFO: test move 'up' to 'start' I [2010-02-16 23:37:00] INFO: test start: ruby /tmp/test.rb I [2010-02-16 23:37:00] INFO: test moved 'up' to 'up' I [2010-02-16 23:37:00] INFO: test [ok] process is running (ProcessRunning)
thanks!
参考にさせて頂ました。ありがとうございます。