screen の backtick をいつか使う

screen には backtick というのがあって、プログラムの出力を caption か hardstusに表示できる。

screen の設定で

backtick 0 0 0 プログラム プラグラム引数

とすると %0` の値がプログラムの最後の出力になる。例えば、

hardstatus alwayslastline "%{=b}%0`"

のように利用する。

いつも何か出力があると気が散るので、使うときのために準備だけしておく。

screen の設定で

backtick 0 0 0 perl $HOME/bin/read_backtick.pl

として、何か出力したいときは、backtick.txtに一行書き出せば、hardstatus に出力する。

echo 'Help me!!!' > ~/tmp/backtick.txt

問題は20秒おきにstatを実行してしまうことなんだけど、面倒なのでいいことにする。出力プログラムにtail -f を使ってもいいけど、tail -f もファイルサイズを定期的に監視しているので負荷的には同じだろう。

#!/usr/bin/perl
use strict;
use warnings;
use IO::File;

my $tick = shift || 20;
my $file = shift || "$ENV{HOME}/tmp/backtick.txt";
my $last_mtime = undef;

while (1) {
    my $mtime = ( stat $file )[9];
    if ( !defined $mtime ) {
        if ( defined $last_mtime ) {

            # Delete file. Clear backtick
            print $/;
            (*STDOUT)->flush;
        }
        else {

            # Deleted file already
        }
        $last_mtime = $mtime;
    }
    elsif ( !defined($last_mtime) or ( $mtime != $last_mtime ) ) {
        if ( open my $fh, '<', $file ) {
            my $line = <$fh>;
            $line =~ s/\x0D?\x0A?$//;
            print $line, $/;
            (*STDOUT)->flush;

            $last_mtime = $mtime;
            close $fh;
        }
    }
    sleep $tick;
}