Linux sanal konsol içeriğini kaydetmek ve bir dosyaya geri almak mümkün mü?


21

Uzun süreli çalışan bir betiğim var ve çıktısını bir dosyaya yönlendirmeyi unuttum. Bir terminalde görebiliyorum ama bir dosyaya kaydedebilir miyim?

teeÇıkış yeniden yönlendirme (örn >. >>) Etc istemiyorum - komut başladı ve tekrar çalıştıramıyorum. Daha önce üretilmiş çıktıları kaydetmem gerekiyor. Ekranımda görebiliyorsam, depolanmış / önbelleğe alınmış / tamponlanmış bir yerdedir. Nerede?

screendump, /dev/vcsXve böylece terminal çıkışına sadece son ekranı kaydetmeme izin veriyor (mevcut değil! - kaydırma terminali yardımcı olmuyor).

Bu, Linux sanal konsolunda, gnome-terminalfare ve diğer özelliklerde olduğu gibi bir X11 terminal emülatörü değil .


1
Evet, görebildiğiniz için bir yerlerde. Ne yazık ki, bu bir yerde ekran için donanım çerçeve tamponu. El ile transkripsiyon yapmak muhtemelen ekran donanımından çıkarmaktan daha kolay olurdu.
msn

İlginç! Ama ... Bir yerde eksik, içinde olduğu gibi /dev/değil mi? Aksi takdirde, nasıl erişeceğinizi yazdınız.
Jüri,

Yanıtlar:


19

/dev/vcs[a]<n>size sadece son ekran-full yukarı kaydırılan olsanız bile olsun, ama seçim olacaktır ioctl()tarafından kullanıldığı gibi s gpmyukarı kaydırılan ettik zaman bile o anda görüntülenen ekrana dökümü sağlayacaktır.

Yani şunları yapabilirsiniz:

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 ve 25'i gerçek ekran genişliğinize ve yüksekliğinize göre ayarlayın.

sleep 3Size (ile yukarı kaydırmak için zaman verir Shift+PageUPBatmana istediğiniz gerçek ekrana). cat > filemacunu adresine yönlendirir file. İle bitirin Ctrl+D.

Detaylar console_ioctl(4)için bakınız.

Eğer varsa gpmyüklü ve çalışır, sen fare ile bu seçimi yapabilirsiniz.

Linux sanal konsol kaydırma ve seçimi çok sınırlı ve oldukça sinir bozucudur (konsolu değiştirdiğinizde tüm kaydırma işlemini kaybedersiniz). İleride, GNU gibi screenya da tmuxiçindeki şeyleri kullanmanızı öneririm (kişisel olarak daha yetenekli terminallerde kullanırım). Onlarla daha büyük aranabilir kaydırmalara sahip olabilir ve bunları kolayca dosyalara bırakabilirsiniz (ve hatta tüm terminal çıkışlarını ve ayrıca bu terminal çoklayıcılarla gelen diğer tüm güzellikleri günlüğe kaydedebilirsiniz).


Tüm kaydırma geri alma arabelleğini boşaltmak için işlemi otomatikleştirmek söz konusu olduğunda, bazı koşullar altında mümkün olması gerekir, ancak API çok sınırlı olduğundan oldukça zor. ioctlMevcut sanal konsolu bir miktar kaydırmayla kaydırmak için belgelenmemiş (TIOCLINUX, subcode = 13) var (yukarı kaydırmak için negatif, aşağı kaydırmak için pozitif).

Ancak geri kaydırma arabelleğinin geçerli boyutunu bilmenin bir yolu yok (bildiğim kadarıyla). Bu tamponun en üstüne ne zaman ulaştığınızı bilmek zor. Geçmeye çalışırsanız, ekran o kadar fazla kaydırılmaz ve ekranın gerçekte ne kadar kaydırıldığını bilmenin güvenilir bir yolu yoktur.

Ayrıca kaydırma ioctl davranışını kararsız buluyorum (en azından VGA konsolu ile), 4 satırdan daha az kaydırmanın sadece ara sıra çalıştığı yerlerde.

Aşağıdaki komut dosyası, kaydırma geri alma tamponunun bir ekrandan bir satırdan daha uzun aynı satır dizileri içermemesi koşuluyla, benim için çerçeve tampon konsollarında (ve bazen de VGA'da) çalışıyor gibi görünüyor.

Oldukça yavaştır çünkü her seferinde bir satır kayar ve her ekran dökümü okunurken 10 dakika beklemesi gerekir.

that-script > fileSanal konsolun içinden kullanılmak üzere .

#! /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/ bir seçenek olabilir mi?

Açıklama:

reredirect, mevcut bir çalışan programı almak ve çıktılarını (standart çıktı ve hata çıkışı) dosyalara veya başka bir işleme eklemek için kullanılan bir araçtır.

Sözdizimi aşağıdaki gibidir:

reredirect -m FILE PID

7
Bu, OP tarafından istendiği gibi üretilen çıkışı kaydetmez, yalnızca yeni çıkış bir yere yönlendirilir.
jimmij

1
Bu doğru ...
Adionditsak

Yani, eğer programım zaten bitmişse, sadece ekranımın fotoğrafını çekebilir miyim?
Jüri,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.