/dev/vcs[a]<n>
上にスクロールした場合でも、最後の画面いっぱいしか取得できませんが、選択 ioctl()
gpm
で使用される s 上にスクロールしても、現在表示されている画面をダンプできます。
できること:
sleep 3; perl -e '
require "sys/ioctl.ph";
# copy:
ioctl(STDIN, &TIOCLINUX, $arg = pack("CS5", 2, 1, 1, 80, 25, 2));
# paste:
ioctl(STDIN, &TIOCLINUX, $arg = "\3")'; cat > file
80 と 25 を実際の画面の幅と高さに調整します。
sleep 3
上にスクロールする時間を与えます (Shift+PageUP を使用) ) をダンプする実際の画面に移動します。 cat > file
ペーストを file
にリダイレクトします . Ctrl+D で終了します .
console_ioctl(4)
を参照 詳細はこちら
gpm
の場合
Linux 仮想コンソールのスクロールバックと選択は非常に制限されており、非常に面倒です (コンソールを切り替えると、スクロールバック全体が失われます)。今後は、GNU screen
などを使用することをお勧めします または tmux
その中にあります(私は個人的に、より高性能な端末でそれらを使用しています)。それらを使用すると、より大きな検索可能なスクロールバックを作成し、それらをファイルに簡単にダンプできます (さらに、すべての端末出力と、それらの端末マルチプレクサーに付属する他のすべての機能をログに記録することもできます)。
スクロールバック バッファ全体をダンプするプロセスの自動化に関しては、一部の条件下では可能ですが、API が非常に限られているため非常に困難です。文書化されていない ioctl
があります (TIOCLINUX, subcode=13) 現在の仮想コンソールをオフセットでスクロールします (上にスクロールする場合は負、下にスクロールする場合は正)。
ただし、スクロールバック バッファの現在のサイズを知る方法はありません (私が知っていることです)。そのため、そのバッファーの最上部にいつ到達したかを知るのは困難です。それを超えてスクロールしようとすると、画面はそれほど移動せず、画面が実際にどれだけスクロールしたかを知る信頼できる方法はありません.
また、スクロールする ioctl の動作が (少なくとも VGA コンソールでは) 不安定で、4 行未満のスクロールがたまにしか機能しないこともわかりました。
以下のスクリプトは、フレーム バッファ コンソール (場合によっては VGA コンソール) でも機能するようです。ただし、スクロールバック バッファに、1 画面に 1 行を加えた長さよりも長い同一行のシーケンスが含まれていない場合に限ります。
一度に 1 行ずつスクロールし、各スクリーン ダンプを読み取るときに eof を 10 ミリ秒待つ必要があるため、非常に低速です。
that-script > file
として使用 仮想コンソール内から。
#! /usr/bin/perl
require "sys/ioctl.ph";
($rows,$cols) = split " ", `stty size`;
$stty = `stty -g`; chomp $stty;
system(qw(stty raw -echo icrnl min 0 time 1));
sub scroll {
ioctl(STDIN, &TIOCLINUX, $arg = pack("Cx3l", 13, $_[0])) or die "scroll: $!";
}
sub grab {
ioctl(STDIN, &TIOCLINUX, $arg = pack("CS5", 2, 1, 1, $cols, $rows, 2)) or die "copy: $!";
ioctl(STDIN, &TIOCLINUX, $arg = "\3") or die "paste: $!";
return <STDIN>;
}
for ($s = 0;;$s--) {
scroll $s if $s;
@lines = grab;
if ($s) {
last if "@lines" eq "@lastlines";
unshift @output, $lines[0];
} else {
@output = @lines;
}
@lastlines = @lines;
}
print @output;
exec("stty", $stty);