Macでcronの出力をGrowlに出力する

定期的にコマンドを実行するプログラムとして、(個人的には)cronをよく使うことがあるのですが...
たまにエラーが出ていたりするとき、その確認方法が結構面倒くさかったり(^_^;)

具体的にはローカルなmailサービス(Mail.appとかではなく)で通知されるので、わざわざTerminal.appでmailコマンドを使わないと駄目みたいな、何言ってんだかわからない方法を採ることになりますw

Mac OS-XならGrowlという通知マネージャがあるので、これを使わない手はありません。

350円
(2013.09.22時点)
posted with ポチレバ

うちの環境は、OS-X Lionなのですが、どうやらローカルなmailサービスとしてはpostfixがインストールされていました。
なので、昔ながらのmail転送設定でコマンドを起動して、Growlに通知することが出来そうです。

設定については、.forwardファイルを使って、growlnotifyコマンドでGrowlに通知します。
Growlは使っているけどgrowlnotifyが無いという方は、公式ページのDownloadページでpkgをDLしてインストールします。

$ cat ~/.forward
| /usr/local/bin/growlnotify

一番単純な.forward設定はこれ。

ただ、これだと余計な(mailのヘッダとか)情報が表示されてしまうので、ちょっとこの辺を取り除くスクリプトを食わせて情報を軽くすることに。

$ cat ~/.forward # 単にGrowlで表示するだけなら
| ~/bin/ml2growl.pl
$ cat ~/.forward # ついでにログ情報も残しておく
| "tee -a ~/Desktop/Mail.txt | ~/bin/ml2growl.pl"

ここではml2growl.plという名前でPerlスクリプトを作りました。
単に、MIME::Parserで解析処理が楽だったという理由ですw

#!/usr/bin/perl
# -*- coding: utf-8 -*-
#
# = Mail2Growl.pl
#  メール情報をgrowlnotifyに透過して通知を表示するフィルタ
#
#  Authors:: Ken AKASHI <ks at ksworks.org>
#  Version:: 2011-11-28
#  License:: NYSL Version 0.9982
#  Copyright:: Copyright (C) ksworks, 2011. All rights reserved.

$GrowlNotify = '/usr/local/bin/growlnotify';

use MIME::Parser;
$parser = new MIME::Parser;
$parser->output_dir('/tmp');
$entity = $parser->parse(*STDIN);

#
# == メールタイトル取得
#  メールのSubjectを拾ってgrowlnotifyにタイトルとしてpipeを開く
#
$subject = $entity->head->get("Subject");
open FH, "| $GrowlNotify -s \'$subject\'" or die "cannot open $GrowlNotify";

#
# == メール情報送信
#  メール本文部分をgrowlnotifyのパラメータとして書き込み
#
$body = $entity->body;
foreach my $line (@$body) {
    print FH $line;
}
close FH;
exit(0);

Perlを使うのであればGrowl::GNTPというモジュールがCPANで公開されているのですが、個人的に使いづらいイメージがあるので、色々こねくり回してコマンドでgrowlnotifyを起動する様にしています。

この場合、mailサービスが絡むので色々面倒なのですが、とりあえずgrowlnotifyの使い方を覚えておくと、コマンドラインで色々遊ぶ際に結構楽しく使えるので便利です( ´ ▽ ` )ノ