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 같은 것을 사용하는 것이 좋습니다 screen. tmux(저는 개인적으로 더 강력한 터미널에서 사용합니다.) 이를 사용하면 더 큰 검색 가능한 롤백을 가질 수 있고 파일에 쉽게 덤프할 수 있습니다(그리고 이러한 터미널 멀티플렉서와 ​​함께 제공되는 다른 모든 기능과 함께 모든 터미널 출력을 기록할 수도 있습니다).


전체 스크롤백 버퍼를 자동으로 덤프하는 과정은 특정 조건에서 가능해야 하지만 API가 매우 제한되어 있어 상당히 어렵습니다. ioctl현재 가상 콘솔을 특정 오프셋(위로 스크롤하는 경우 음수 값, 아래로 스크롤하는 경우 양수 값)만큼 스크롤하는 문서화되지 않은(TIOCLINUX, 하위 코드=13)이 있습니다 .

그러나 (내가 아는 한) 스크롤백 버퍼의 현재 크기를 알 수 있는 방법은 없습니다. 따라서 버퍼의 상단에 언제 도달했는지 알기가 어렵습니다. 화면을 지나쳐 스크롤하려고 하면 화면이 그다지 많이 움직이지 않으며 화면이 실제로 얼마나 스크롤되는지 알 수 있는 신뢰할 수 있는 방법이 없습니다.

나는 또한 스크롤링 ioctl의 동작이 불규칙하고(적어도 VGA 콘솔의 경우) 4줄 미만의 스크롤이 가끔씩만 작동한다는 것을 발견했습니다.

다음 스크립트는 스크롤백 버퍼에 한 화면에 한 줄을 더한 것보다 긴 동일한 일련의 줄이 포함되어 있지 않은 경우 프레임 버퍼 콘솔(때로는 VGA 콘솔에서도)에서 작동하는 것으로 보입니다.

한 번에 한 줄씩 스크롤하고 각 화면 덤프를 읽는 동안 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);

답변2

https://github.com/jerome-pouiller/reredirect/옵션이 아닐까요?

설명하다:

reredirect는 기존 실행 중인 프로그램을 가져와 해당 출력(표준 출력 및 오류 출력)을 파일이나 다른 프로세스에 추가하는 유틸리티입니다.

구문은 다음과 같습니다.

reredirect -m FILE PID

관련 정보