GNU screenを使って新着メール数を表示
http://dev.ariel-networks.com/Members/matsuyama/emacs-mew-fetchmail-procmail306a30e130fc30eb74b05883
メールを受信できるようになったのはいいのですが、新着があるかどうかもわからずにfetchmail -cしたりM-x mewするのはナンセンスというか面倒くさいのです。やはり理想はターミナルのどこかに新着メール数を表示してくれることです。幸いにも当方GNU screenのhardstatus alwayslastline(ターミナルの最終行にあらゆる情報を表示することができるステータス表示機能)を使っておりますので、ここに表示してしまうのが最も楽で見栄えもよいHackになるのです。ということで新着メール数を求める方法について検討したいと思います。まず一番はじめに思い浮かぶのが、.maildir/newのファイル数をそのまま新着メール数にしてしまうという方法。メリットはサーバー上にメールをkeepしなくてもよい。デメリットは実際に(バックグラウンドで)メールを受信しなければならない(あまりデメリットになっていない)。ほかの方法としてはサーバー上にメールをkeepしてしまってfetchmail -cの出力結果を解析して新着メール数を求める方法。メリットは実際にメールを受信するわけではないので計算時の負荷が小さい。デメリットはメールをサーバー上にkeepしなくてはならない(これは大きい)。現在のところ僕は後者の環境なのですので(近いうちに前者へ)、そちらを前提して説明します。
まずfetchmail -cで新着メール数を求める方法。これは何を使ってもいいのですが、fetchmail -cの出力結果が解析しづらい(というわけではないのですが)のと統一の問題を考慮して、Perlで書いてしまうのがいいと思います。
my ($total, $read) = `fetchmail -c` =~ /^(\d+).+?(\d+)/; my $unread = $total - $read; $unread = 0 if $unread < 0; # parse error ? print $unread, "\n";
次に上のPerlスクリプトによって得られた値をターミナル、すなわちscreenのhardstatus alwayslastlineに送ります。(いろいろ方法はあるらしいですが)値を送る方法としてはscreenの-Xオプション(指定されたscreenに指定されたコマンドを送信するオプション)を使ってその都度hardstatus alwayslastlineを上書きしてしまうのが一番わかりやすいでしょう。具体的には以下のようになります。
% screen -r -X hardstatus alwayslastline Mail(0)
これでhardstatus alwayslastlineにMail(0)と表示されますので、0の部分を先ほど求めた$unreadに置きかえてやればいいわけです。
screenstatus:
#!/usr/bin/perl my ($total, $read) = `fetchmail -c` =~ /^(\d+).+?(\d+)/; my $unread = $total - $read; $unread = 0 if $unread < 0; `screen -r -X hardstatus alwayslastline Mail($unread)`;
実際に新着メール数をチェックさせてhardstatus alwayslastlineを更新させるには、このスクリプトを起動します。
% ./screenstatus
さて、これで新着メール数をターミナルに表示することはできましたが、いちいちscreenstatusを起動するのは面倒すぎます。普通の人ならcrontabに登録して自動で新着メール数が更新される姿にうっとりしたいはずです。というわけでcrontabに登録しましょう。
% crontab -e */10 * * * * /home/example/bin/screenstatus
これで10分ごとに新着メール数が更新されるはず!とワクワクしながら待てど一向に更新される気配がありません。
% crontab -e */10 * * * * screen -r -X hardstatus alwayslastline test > /tmp/stdout 2> /tmp/stderr
として/tmp/stdoutを確かめてみると
No screen session found.
となってしまっています。どうやら同一セッション内からでしか-rオプション(既存screenをresumeするオプション)を使えないようです。いろいろ対策を探しては試してみましたが一つの方法を除いて全て失敗におわりました。唯一成功した方法では-Sオプション(PIDからscreenを指定するオプション)を使用するので無理矢理感が否めませんが、ほかに方法がないのでこの方法を使うようにscreenstatusスクリプトを修正します。
screenstatus:
#!/usr/bin/perl my ($pid) = `screen -ls` =~ /(\d+).+Attached/; # assume first number is PID my ($total, $read) = `fetchmail -c` =~ /^(\d+).+?(\d+)/; my $unread = $total - $read; $unread = 0 if $unread < 0; `screen -S $pid -X hardstatus alwayslastline Mail($unread)`;
これで無事10分ごとに新着メール数が更新されるようになりました。いやはやかっこいいですね。ぶっちゃけていうと、-Xオプションがサポートされているscreenでは新着メール数に限らずなんでも表示できてしまいます。screen最強です(screenに関するエントリも書く予定)。
なおrootで-Xオプションを使うにはコマンドが送られる側でaddacl or acladdコマンドが呼ばれている必要があります。
~.screenrc:
addacl root
あるいはC-a :でaddacl rootと逐次登録するのもありです。
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/matsuyama/gnu-screen30924f7f3063306665b0774030e130fc30eb657030928868793a/tbping
Re:GNU screenを使って新着メール数を表示
Re:GNU screenを使って新着メール数を表示
http://acapulco.dyndns.org/hiki/hiki.cgi?%28Gentoo%29Screen