Linux 가상 콘솔 컨텐츠 및 스크롤 백을 파일로 저장할 수 있습니까?


21

장기 실행 스크립트가 있으며 출력을 파일로 리디렉션하는 것을 잊었습니다. 터미널에서 볼 수 있지만 파일로 저장할 수 있습니까?

나는 요구하고 있지 않다 tee출력 재 지정 (예를 들어 >, >>명령이 시작, 나는 다시 실행할 수 없습니다 -) 등. 이미 생성 된 출력을 저장해야합니다. 디스플레이에서 볼 수 있으면 저장 / 캐시 / 버퍼가있는 것입니다. 어디에?

screendump/dev/vcsX을 사용하면 터미널 출력에서 ​​마지막 화면 만 저장할 수 있습니다 (현재는 아닙니다!-스크롤 터미널은 도움이되지 않습니다).

이것은 Linux 가상 콘솔에 gnome-terminal있으며 마우스 및 기타 제품과 같은 X11 터미널 에뮬레이터가 아닙니다 .


1
네, 당신이 그것을 볼 수 있기 때문에 어딘가에 있습니다. 불행히도, 어딘가에 디스플레이 용 하드웨어 프레임 버퍼가 있습니다. 디스플레이 하드웨어에서 꺼내는 것보다 수작업으로 작성하는 것이 더 쉬울 것입니다.
msw

흥미 롭습니다! 하지만 ..에서와 같이 어딘가에 빠져 /dev/있습니다. 그렇지 않으면 도달하는 방법을 썼습니다.
Jury

답변:


19

/dev/vcs[a]<n>위로 스크롤 한 경우에도 마지막 화면이 꽉 찼지만 스크롤 ioctl()을 사용해 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+PageUP덤프하려는 실제 화면 으로 스크롤 할 시간 이 생깁니다. cat > file붙여 넣기를로 리디렉션합니다 file. 로 완료하십시오 Ctrl+D.

자세한 내용 console_ioctl(4)을 참조하십시오.

이 경우 gpm설치 및 실행, 당신은 마우스로 해당 선택을 할 수 있습니다.

Linux 가상 콘솔 스크롤 백 및 선택은 매우 제한적이고 성가시다 (콘솔을 전환하면 전체 스크롤 백이 손실 됨). 앞으로 GNU와 같은 것을 사용 screen하거나 그 tmux내부에서 사용하는 것이 좋습니다 (개인적으로 더 유능한 터미널에서 사용합니다). 그것들을 사용하면 더 큰 검색 가능한 스크롤 백을 가지고 파일에 쉽게 덤프 할 수 있습니다 (그리고 모든 터미널 출력과 터미널 멀티플렉서와 ​​함께 제공되는 다른 모든 것들을 기록 할 수도 있습니다).


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

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

또한 스크롤이 가능한 ioctl의 동작 (최소한 VGA 콘솔에서는)이 4 줄 미만으로 스크롤되는 경우가 가끔 있습니다.

아래 스크립트는 스크롤 버퍼에 하나의 스크린과 한 줄보다 긴 동일한 행 시퀀스가 ​​포함되어 있지 않으면 프레임 버퍼 콘솔 (때로는 VGA 콘솔)에서 작동하는 것 같습니다.

한 번에 한 줄씩 스크롤하기 때문에 속도가 느리고 각 화면 덤프를 읽을 때 10ms 동안 eof를 기다려야합니다.

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

0

https://github.com/jerome-pouiller/reredirect/ 는 옵션 일 수 있습니까?

기술:

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

구문은 다음과 같습니다.

reredirect -m FILE PID

7
OP가 요청한대로 이미 생성 된 출력을 저장하지 않으며 새 출력 만 어딘가에 리디렉션됩니다.
jimmij

1
그건 사실이야 ...
Adionditsak

따라서 프로그램이 이미 완료된 경우 내 디스플레이 사진 만 찍을 수 있습니까?
Jury
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.