それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

処理が終わったらメールで通知したい。

お題のとおりです。処理が終わったら、Growlやメールで通知したい。

ちょっと時間のかかる処理をやっていて、終わったら、メールで通知してほしい。ddとかね。

通知するアイディア

パっと、思いつくのはこんな感じで使うこと。でもこれじゃダメなんだ。

$ ./command | gmail
$ ./command | growl
$ gmail_notify ./commmand
$ growl_notify ./command

こういう例はすぐ思いつくサンプルも多いし。でもさー

起動し忘れたら終わり。

この書き方だと起動し忘れた時に大変。他にも思った以上に時間がかかったよ!みたいなときに対応できない。

プロセス監視っぽくやります。

process番号を監視して、プロセスが消えたらメールを送るようにしてみた。

こんな感じで使いたい。

$ ./gmail_notify PID:プロセスID


これだと、あとからプロセスIDを元に通知を作れるから、幅広く使えそう。

growlどうすんの!?

Growlは・・・Gmailを監視してればいいんです!

gmailにメール来る→Growl通知される

メールを送るとiPhoneなどデバイスでも通知されるので、絶対メールのほうが便利。

メール通知設定しておけば、連鎖で簡単。これで終了ですね。

プロセス番号を監視する。

#!/usr/bin/env ruby
#処理が終わったら、メールで通知したい。
# http://d.hatena.ne.jp/takuya_1st/
require 'rubygems'
require 'net/smtp'
require 'base64'
require 'tmail'
require 'tlsmail'

def send_gmail( body= nil )
mail = TMail::Mail.new

mail.to = "takuya@example.com"
mail.from = "takuya@example.com"
mail.subject = "処理終了"
mail.date = Time.now
mail.mime_version = "1.0"
mail.set_content_type "text", "plain", {"charset" => "iso-2202-jp"}

t = Time.now.strftime("%Y-%m-%d %H:%M:%S")
mail.body = "処理終了 (#{t})" unless body

Net::SMTP.enable_tls(OpenSSL::SSL::VERIFY_NONE)
Net::SMTP.start( "smtp.gmail.com", 587, "local","takuya@example.com”,”***PASS***","plain" ){|smtp|
    smtp.sendmail( mail.encoded,mail.from,mail.to )
}
end

def still_alive?( proccess_id )
     `ps #{proccess_id}`.split(/\n/).size >1
end


def watch( process_id)
          while( still_alive? process_id) do
                    sleep 60
          end
end


puts "Usage : #{__FILE__} PROCESS_ID " if ARGV.size < 0
exit if ARGV.size <  0

watch( ARGV.shift)
send_gmail()

これはほんとうに正しいのかわからない。
Linuxシステムコールのプロセス監視・管理あたりで正しくやりたいけど。とりあえず、さくっと動くからよしとする。