เป็นไปได้หรือไม่ที่จะบันทึกเนื้อหาคอนโซลเสมือนของ Linux และ scrollback ลงในไฟล์?


21

ฉันมีสคริปต์ที่ทำงานระยะยาวและฉันลืมที่จะเปลี่ยนเส้นทางผลลัพธ์ไปยังไฟล์ ฉันเห็นมันในเทอร์มินัล แต่ฉันสามารถบันทึกลงในไฟล์ได้หรือไม่?

ฉันไม่ได้ขอteeเปลี่ยนเส้นทางการส่งออก (เช่น>, >>) ฯลฯ - คำสั่งได้เริ่มต้นและผมก็ไม่สามารถทำงานได้อีกครั้ง ฉันต้องบันทึกผลลัพธ์ที่สร้างไว้แล้ว ถ้าฉันเห็นมันบนจอแสดงผลของฉันมันจะถูกเก็บไว้ / แคช / บัฟเฟอร์ ที่ไหน?

screendump, /dev/vcsXและอื่น ๆ ช่วยให้ฉันเพื่อบันทึกหน้าจอเท่านั้นที่ผ่านมาในการส่งออกมินัล (ปัจจุบันไม่ได้! - เลื่อนขั้วไม่ได้ช่วย)

นี่คือคอนโซลเสมือน Linux ไม่ใช่เทอร์มินัลอีมูเลเตอร์ X11 เช่นเดียวgnome-terminalกับเมาส์และสินค้าอื่น ๆ


1
ใช่เนื่องจากคุณสามารถดูได้มันอยู่ที่ไหนซักแห่ง น่าเสียดายที่บางแห่งเป็นบัฟเฟอร์เฟรมฮาร์ดแวร์สำหรับจอแสดงผล มันอาจจะง่ายกว่าในการถอดเสียงด้วยมือมากกว่าถอดออกจากฮาร์ดแวร์จอแสดงผล
msw

! ที่น่าสนใจ แต่ ... มันหายไปไหนซักแห่ง/dev/ใช่ไหม? มิฉะนั้นคุณได้เขียนวิธีการเข้าถึง
คณะลูกขุน

คำตอบ:


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 เสร็จสิ้นด้วยfileCtrl+D

ดูconsole_ioctl(4)รายละเอียดที่

หากคุณgpmติดตั้งและใช้งานคุณสามารถเลือกด้วยเมาส์ได้

การเลื่อนและการเลือกคอนโซลเสมือนของ Linux มีข้อ จำกัด มากและค่อนข้างน่ารำคาญ (เมื่อคุณเปลี่ยนคอนโซลคุณจะสูญเสียทั้งการย้อนกลับ) ก้าวไปข้างหน้าฉันขอแนะนำให้คุณใช้สิ่งต่าง ๆ เช่น GNU screenหรือtmuxภายใน (ฉันใช้มันในอาคารที่มีความสามารถมากกว่า) คุณสามารถมี scrollbacks ที่ค้นหาได้มากขึ้นและถ่ายโอนไฟล์ไปยังไฟล์ได้อย่างง่ายดาย (และบันทึกการทำงานของเทอร์มินัลเอาท์พุทรวมถึงสินค้าอื่น ๆ ที่มาพร้อมกับเทอร์มินัลมัลติเพล็กเซอร์เหล่านั้น)


สำหรับกระบวนการที่จะถ่ายโอนบัฟเฟอร์การเลื่อนกลับทั้งตัวโดยอัตโนมัติกระบวนการนี้ควรเป็นไปได้ภายใต้เงื่อนไขบางประการ แต่ค่อนข้างยากเนื่องจาก API มีข้อ จำกัด มาก มีการไม่มีเอกสารioctl(TIOCLINUX, subcode = 13) เพื่อเลื่อนคอนโซลเสมือนปัจจุบันโดยออฟเซ็ตบางอย่าง (เชิงลบสำหรับการเลื่อนขึ้น, บวกสำหรับการเลื่อนลง)

อย่างไรก็ตามไม่มีทาง (ที่ฉันรู้) รู้ขนาดปัจจุบันของบัฟเฟอร์การเลื่อน ดังนั้นจึงเป็นการยากที่จะรู้ว่าเมื่อคุณมาถึงจุดสูงสุดของบัฟเฟอร์นั้น หากคุณพยายามเลื่อนผ่านหน้าจอจะไม่เลื่อนไปมากและไม่มีวิธีที่เชื่อถือได้ที่จะรู้ได้ว่าหน้าจอเลื่อนไปเท่าใด

ฉันยังพบพฤติกรรมของการเลื่อน ioctl ที่ผิดปกติ (อย่างน้อยกับคอนโซล VGA) ซึ่งการเลื่อนโดยน้อยกว่า 4 บรรทัดใช้งานได้เป็นครั้งคราวเท่านั้น

สคริปต์ด้านล่างดูเหมือนจะทำงานกับฉันในคอนโซลเฟรมบัฟเฟอร์ (และบางครั้งใน VGA) หากบัฟเฟอร์ scrollback ไม่ได้มีลำดับของบรรทัดที่เหมือนกันนานกว่าหนึ่งหน้าจอบวกหนึ่งบรรทัด

มันค่อนข้างช้าเพราะมันเลื่อนทีละหนึ่งบรรทัดและต้องรอ 10 มิลลิวินาทีสำหรับ 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

ดังนั้นถ้าโปรแกรมของฉันเสร็จสิ้นฉันสามารถถ่ายรูปจอแสดงผลของฉันได้เท่านั้น
คณะลูกขุน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.