क्या किसी फ़ाइल में लिनक्स वर्चुअल कंसोल कंटेंट और स्क्रॉलबैक को सहेजना संभव है?


21

मेरे पास एक लंबी अवधि की स्क्रिप्ट है और मैं इसके आउटपुट को किसी फ़ाइल में पुनर्निर्देशित करना भूल गया। मैं इसे एक टर्मिनल में देख सकता हूं, लेकिन क्या मैं इसे एक फाइल में सहेज सकता हूं?

मैं teeआउटपुट पुनर्निर्देशन (जैसे >, >>आदि) के लिए नहीं कह रहा हूं - कमांड शुरू हो गया है, और मैं इसे फिर से नहीं चला सकता। मुझे पहले से उत्पन्न आउटपुट को बचाने की आवश्यकता है। अगर मैं इसे अपने प्रदर्शन पर देख सकता हूं, तो यह कहीं संग्रहीत / कैश्ड / बफर है। कहा पे?

screendump, /dev/vcsXऔर इसलिए मुझे टर्मिनल आउटपुट पर केवल अंतिम स्क्रीन को बचाने की अनुमति देता है (वर्तमान नहीं! - स्क्रॉलिंग टर्मिनल मदद नहीं करता है)।

यह एक लिनक्स वर्चुअल कंसोल पर है, न कि 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पेस्ट को पुनर्निर्देशित करता है file। इसके साथ समाप्त करें Ctrl+D

console_ioctl(4)विवरण के लिए देखें।

यदि आपने gpmस्थापित किया है और चल रहा है, तो आप उस चयन को माउस से कर सकते हैं।

लिनक्स वर्चुअल कंसोल स्क्रॉलबैक और चयन बहुत सीमित और काफी कष्टप्रद है (इसमें जब आप कंसोल स्विच करते हैं, तो आप पूरे स्क्रॉलबैक को खो देते हैं)। आगे बढ़ते हुए, मेरा सुझाव है कि आप GNU जैसी चीजों का उपयोग करें screenया इसके tmuxभीतर (मैं व्यक्तिगत रूप से उन्हें और भी अधिक सक्षम टर्मिनलों में उपयोग करता हूं)। उनके साथ, आपके पास बड़ी खोज योग्य स्क्रॉलबैक हो सकती हैं और आसानी से उन्हें फाइलों में डंप कर सकती हैं (और यहां तक ​​कि सभी टर्मिनल आउटपुट को भी लॉग इन करें, साथ ही उन टर्मिनल मल्टीप्लेक्सर्स के साथ आने वाले अन्य सभी उपहार भी)।


पूरे स्क्रॉलबैक बफर को डंप करने के लिए प्रक्रिया को स्वचालित करने के लिए, यह कुछ शर्तों के तहत संभव होना चाहिए, लेकिन एपीआई बहुत सीमित होने के कारण काफी मुश्किल है। ioctlवर्तमान वर्चुअल कंसोल को कुछ ऑफसेट (स्क्रॉल करने के लिए नकारात्मक, स्क्रॉल करने के लिए पॉजिटिव के लिए नकारात्मक) को स्क्रॉल करने के लिए एक अनजाने (TIOCLINUX, सबकोड = 13) है।

हालांकि, स्क्रॉलबैक बफर के वर्तमान आकार को जानने का कोई तरीका नहीं है (जो मुझे पता है)। इसलिए यह जानना कठिन है कि आप उस बफर के शीर्ष पर कब पहुंचे हैं। यदि आप इसे पिछले स्क्रॉल करने का प्रयास करते हैं, तो स्क्रीन को उतने शिफ्ट नहीं किया जाएगा और यह जानने का कोई विश्वसनीय तरीका नहीं है कि स्क्रीन ने वास्तव में कितना स्क्रॉल किया है।

मुझे स्क्रॉलिंग ioctl अनिश्चित (कम से कम वीजीए कंसोल के साथ) का व्यवहार भी मिलता है, जहां 4 से कम लाइनों द्वारा स्क्रॉल करना कभी-कभी ही काम करता है।

नीचे दी गई स्क्रिप्ट मुझे फ्रेम बफ़र कंसोल (और कभी-कभी वीजीए वालों पर) के लिए काम करती है, बशर्ते कि स्क्रॉलबैक बफर में एक स्क्रीन और एक लाइन से अधिक समान लाइनों के अनुक्रम न हों।

यह काफी धीमा है क्योंकि यह एक समय में एक लाइन को स्क्रॉल करता है, और प्रत्येक स्क्रीन डंप को पढ़ते समय ईओएफ के लिए 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);

0

https://github.com/jerome-pouiller/reredirect/ एक विकल्प हो सकता है?

विवरण:

reredirect एक मौजूदा रनिंग प्रोग्राम को लेने और उसके आउटपुट (स्टैंडर्ड आउटपुट और एरर आउटपुट) को फाइलों या किसी अन्य प्रक्रिया में संलग्न करने की एक उपयोगिता है।

सिंटैक्स निम्नानुसार है:

reredirect -m FILE PID

7
यह पहले से ही उत्पन्न आउटपुट को नहीं बचाता है क्योंकि ओपी ने पूछा है, केवल नए आउटपुट को कहीं न कहीं पुनर्निर्देशित किया जाएगा।
जिमीज

1
यह सच है ...
Adionditsak

इसलिए, यदि मेरा कार्यक्रम पहले ही समाप्त हो गया है, तो मैं केवल अपने प्रदर्शन का फोटो ले सकता हूं?
जूरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.