Personal tools
You are here: Home ブログ matsuyama GNU screenを使って新着メール数を表示
Document Actions

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と逐次登録するのもありです。

Category(s)
linux
emacs
The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/matsuyama/gnu-screen30924f7f3063306665b0774030e130fc30eb657030928868793a/tbping

Re:GNU screenを使って新着メール数を表示

Posted by inoue at 2006-07-24 14:43
cronを使わずに、無限ループの中で10分間スリープするスクリプトを動かすのも手かもしれません。

Re:GNU screenを使って新着メール数を表示

Posted by kimata at 2006-07-31 21:21
初めまして.Wanderlust の wl-biff-notify-hook との組み合わせはどうでしょう?
http://acapulco.dyndns.org/hiki/hiki.cgi?%28Gentoo%29Screen
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.