tokuhirom's Blog

screen の他のウィンドウの結果をとりだす screen-pipe コマンド

複数ホストに ssh しながら tail -F するときにはこうしたらどう?という話の続きです。

どうしても映画に出てくるようなハッカーになりたいのであったが、オールドタイプなので既存の UNIX tools をくみあわせて最強の環境の構築にはげむ僕がいます。

以下のようなツールをもちいまして、任意の window の出力を現在のウィンドウから出力させます。

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use 5.010000;
use autodie;
use File::Temp qw/tempfile/;

my $window = shift @ARGV || 1;
my ($tmpfh, $tmpfname) = tempfile(UNLINK => 1);
warn $window;
system(
    qq{screen -X eval 'select $window' 'log off' 'logfile $tmpfname' 'logfile flush 1' 'log on'})
  == 0
  or die;

system(qq!screen -X eval "select $ENV{WINDOW}"!);
exec 'tail', '-F', $tmpfname;

で、こういう風にしてとりだした結果をもとに

grep -B ' 500 '

とか

grep ' 404 '

とか一個の踏み台サーバーからログをぶっこぬいてきておいて、それを複数のウィンドウにことなる条件で grep かけたものなどを眺めることが可能となります。

この方法の問題点は、ディスクにどんどん書いてしまうことですね。screen の限界をビンビンに感じます。tmux なら pipe-pane とかつかってもっとスマートにできそうです。truncate とかできればいいんですが、なんかいろいろめんどくさそうです。
あと、そんなにたいした量のデータはたまらないのでまあ我慢できないこともないかな、なんておもったり。

tmux で同様のことをするプログラム、だれか書いてくれませんかな?