お題のとおりです。処理が終わったら、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システムコールのプロセス監視・管理あたりで正しくやりたいけど。とりあえず、さくっと動くからよしとする。