harry’s memorandum

おれおれメモ

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' を作成

notify_smtp()にtlsを対応させています。

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!

参考にさせて頂ました。ありがとうございます。