Linux仮想コンソールのコンテンツを保存してファイルにスクロールバックできますか?

Linux仮想コンソールのコンテンツを保存してファイルにスクロールバックできますか?

長い間実行されるスクリプトがあり、出力をファイルにリダイレクトするのを忘れていました。端末で見ることができますが、ファイルとして保存できますか?

tee出力リダイレクト>などを要求しません>>。コマンドが開始されたため、再実行できません。生成された出力を保存する必要があります。モニターから見ると、ストレージ/キャッシュ/バッファリングのどこかにあります。どこ?

screendumpなどを/dev/vcsX使用すると、端末出力の最後の画面のみを保存できます(現在の画面ではありません! - 端末をスクロールしても役に立ちません)。

gnome-terminalこれは、マウスなどのX11端末エミュレータではなく、Linux仮想コンソールにあります。

ベストアンサー1

/dev/vcs[a]<n>ioctl()これにより、最後の全画面のみが表示されますが、selectを使用すると、上にスクロールしてもgpm現在表示されている画面をダンプできます。

だからあなたはこれを行うことができます:

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+PageUPcat > filefileCtrl+D

console_ioctl(4)詳細より。

インストールして実行している場合は、gpmマウスを使用して選択できます。

Linux仮想コンソールのスクロールバックと選択は非常に制限的で非常に迷惑です(なぜなら、コンソールを切り替えるとスクロールバック全体が失われるため)。将来的には、GNUのようなものを使用することをお勧めしますscreentmux(私は個人的により強力な端末で使用します。)これにより、より大きな検索可能なロールバックを持つことができ、ファイルに簡単にダンプできます(そして、これらの端末マルチプレクサに付属する他のすべての機能と一緒にすべての端末を出力します。を記録することもできます)。


スクロールバックバッファ全体を自動的にダンプするプロセスは特定の条件下で可能でなければなりませんが、APIが非常に制限されているため、かなり困難です。ioctl現在の仮想コンソールを特定のオフセット(上にスクロールする場合は負の値、下にスクロールする場合は正の値)だけスクロールする文書化されていません(TIOCLINUX、サブコード= 13)。

しかし、私が知っている限り、スクロールバックバッファの現在のサイズを知る方法はありません。したがって、バッファの上部にいつ到達したかを知ることは困難です。画面を過ぎてスクロールしようとすると、画面があまり動かなくなり、画面が実際にどれだけスクロールしているかを知るための信頼できる方法はありません。

私はまた、スクロールioctlの動作が不規則で(少なくともVGAコンソールの場合)、4行未満のスクロールが時々動作することを発見しました。

次のスクリプトは、スクロールバックバッファに1つの画面に1行を加えたものより長い同じ一連の行が含まれていない場合、フレームバッファコンソール(時にはVGAコンソールでも)で動作するようです。

一度に1行ずつスクロールし、各画面ダンプを読み取るのに10msの待ち時間が必要なため、非常に遅いです。

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);

おすすめ記事