फ़ाइल में स्क्रीन (प्रोग्राम) आउटपुट सहेजें


130

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

इसका कारण यह है कि मैं एक सीरियल पोर्ट के माध्यम से फ्लैश मेमोरी को डंप कर रहा हूं, इसके साथ स्क्रीन टू इंटरफेस का उपयोग कर रहा हूं। मैं स्मृति संरचना की जांच करने के लिए इसे एक फ़ाइल में सहेजना चाहूंगा।

मैंने कोशिश की:

$: screen /dev/ttyUSB0 115200 >> foo.txt
$: screen /dev/ttyUSB0 115200 | tee foo.txt

और मैंने स्क्रीन से बफरफाइल का उपयोग करने की भी कोशिश की है, लेकिन मुझे समझ नहीं आ रहा है कि इसका उपयोग कैसे किया जाए।

क्या कोई आसान तरीका है?


मेरे द्वारा उपयोग की जा रही उत्पादन सेटिंग में स्क्रीन के कई उदाहरण हैं। जिसके आउटपुट की मुझे आवश्यकता है वह 'pts / 10' है। इसलिए मुझे इसका आउटपुट फाइल में प्राप्त करने के लिए क्या करना चाहिए?
सिड

जवाबों:


129

लॉगिंग के लिए कमांड लाइन विकल्प है। आउटपुट को screenlog.n फ़ाइल में सहेजा जाता है, जहाँ n स्क्रीन की एक संख्या है। स्क्रीन के मैन पेज से:

'-L' विंडो के लिए स्वचालित आउटपुट लॉगिंग चालू करने के लिए स्क्रीन बताएं।


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

48
बस थोड़ा और अधिक googled .. यहाँ मेरी स्पष्ट टिप्पणी के लिए जवाब है - stackoverflow.com/questions/4807474/… Ctrl + A और: कमांड मोड में लाने के लिए, तो हार्डकॉपी -एच <फ़ाइल नाम> मामले में किसी को इसकी आवश्यकता होगी।
तगर

3
लॉग फ़ाइल उसी निर्देशिका में बनाई जाएगी जिसमें आपने स्क्रीन निष्पादित की थी।
लेप

1
कल मैंने एक "स्क्रीन -L" किया, मेरे SSH सत्र को डिस्कनेक्ट कर दिया, आज फिर से लॉग इन किया और "स्क्रीन -r" (मैं केवल एक था) का उपयोग करके एक्साइट किया गया, बाहर निकल गया, और find / -name "screen*log"कुछ भी नहीं मिला।
pacoverflow


104

आप loglogings को screenlog.n फ़ाइल में सहेजने के लिए Control-a + H का भी उपयोग कर सकते हैं। बंद करने के लिए एक और नियंत्रण-ए + एच।

सीए एच: "स्क्रीनलॉग.एन" फाइल के लिए वर्तमान विंडो के लॉगिंग शुरू / समाप्त होता है।


5
+1। यदि लॉग नहीं बनाया जा सकता है, तो स्क्रीन विंडो की कार्यशील निर्देशिका को बदलने का प्रयास करें: Ctrl- a+ :और उदाहरण के लिए टाइप करेंchdir /home/foobar/baz
Chriki

2
सीए + एच सिर्फ मेरे लिए स्क्रीन विंडो स्विच करता है। एक लॉग फ़ाइल के साथ कुछ नहीं करना है!
aaa90210

2
@ aaa90210 यह ctrl-a है जिसमें हार्डकॉपी के लिए h का एक अलग प्रेस है। ctrl-Shift-h के एक अलग प्रेस के बाद एक पूर्ण लॉग फ़ाइल शुरू होती है।
जेम्स

1
Ctrl-a H द्वारा बनाई गई screenlog.0 फ़ाइल की तलाश है? unix.stackexchange.com/questions/198881/…
straville

20

चयनित उत्तर कई सत्रों के साथ अच्छी तरह से काम नहीं करता है और एक कस्टम लॉग फ़ाइल नाम निर्दिष्ट करने की अनुमति नहीं देता है।

कई स्क्रीन सत्रों के लिए, यह मेरा सूत्र है:

  1. प्रत्येक प्रक्रिया के लिए एक विन्यास फाइल बनाएँ:

    logfile test.log
    logfile flush 1
    log on
    logtstamp after 1
    logtstamp string "[ %t: %Y-%m-%d %c:%s ]\012"
    logtstamp on
    

    यदि आप इसे "फ्लाई पर" करना चाहते हैं, तो आप logfileस्वचालित रूप से बदल सकते हैं । \012"नई लाइन" का अर्थ है, जैसे कि इसका उपयोग \nलॉग फाइल पर प्रिंट करेगा: स्रोत

  2. "-C" और "-L" झंडे के साथ अपनी कमांड शुरू करें:

    screen -c ./test.conf -dmSL 'Test' ./test.pl
    

    बस। पहले फ्लश के बाद आपको "test.log" दिखाई देगा:

    ...
    6 Something is happening...
    [ test.pl: 2016-06-01 13:02:53 ]
    7 Something else...
    [ test.pl: 2016-06-01 13:02:54 ]
    8 Nothing here
    [ test.pl: 2016-06-01 13:02:55 ]
    9 Something is happening...
    [ test.pl: 2016-06-01 13:02:56 ]
    10 Something else...
    [ test.pl: 2016-06-01 13:02:57 ]
    11 Nothing here
    [ test.pl: 2016-06-01 13:02:58 ]
    ...
    

मैंने पाया कि कॉन्फ़िगरेशन फ़ाइल पर "लॉग ऑन" होने पर भी "-L" की आवश्यकता है।

मुझे स्क्रीन द्वारा उपयोग किए जाने वाले समय प्रारूप चर (जैसे% m) की सूची नहीं मिली। यदि आपके पास उन प्रारूपों का लिंक है, तो कृपया इसे पोस्ट करें।

अतिरिक्त

यदि आप इसे "फ्लाई पर" करना चाहते हैं, तो आप इस स्क्रिप्ट का उपयोग कर सकते हैं:

#!/bin/bash
if [[ $2 == "" ]]; then
    echo "Usage: $0 name command";
    exit 1;
fi
name=$1
command=$2
path="/var/log";
config="logfile ${path}/${name}.log
logfile flush 1
log on
logtstamp after 1
logtstamp string \"[ %t: %Y-%m-%d %c:%s ]\012\"
logtstamp on";
echo "$config" > /tmp/log.conf
screen -c /tmp/log.conf -dmSL "$name" $command
rm /tmp/log.conf

इसका उपयोग करने के लिए, इसे (screen.sh) सहेजें और + x अनुमतियाँ सेट करें:

./screen.sh TEST ./test.pl

... और ./test.pl निष्पादित करेगा / लॉग फ़ाइल को /var/log/TEST.log में बनाएगा


1
धन्यवाद - on-the-flyहिस्सा सुपर उपयोगी है।
राम आरएस

1
बाद में, एक स्क्रीन एक रात को बनाई गई एक कॉन्फिग फाइल के साथ चलती है और फ्लाई आउट पर डिलीट screen -rहो जाती है "Unable to open "/tmp/log.conf"। इसके अलावा, स्क्रीन [detached]राज्य से गैर-मौजूद थी। क्या समस्या हो सकती थी?
राम आरएस

1
आपकी आज्ञा क्या करती है? स्क्रीन गायब होने पर लॉग फ़ाइल को फिर से बनाएगा, इसलिए मैं अनुमान लगा रहा हूं / अंतरिक्ष से tmp / run हो रहा है या कुछ अन्य OS से संबंधित समस्या थी? मैं कई सर्वरों में इस दृष्टिकोण का उपयोग करता हूं जो अनिश्चित काल तक चलते हैं और अब तक मैंने कम से कम 1 वर्ष में ऐसी स्थिति नहीं देखी है। यदि आप चाहें तो हम एक चैट शुरू कर सकते हैं और मैं आपकी समस्या को दूर करने में आपकी मदद कर सकता हूं।
लेप

1
मुझे लगता है कि आप सही हैं, यह कोई स्क्रीन को समाप्त करना चाहिए आप जो को क्रियान्वित करने के समान ही है कि जिस तरह से प्रक्रिया, चला रहे हैं: screen bash। यदि कोई अन्य प्रक्रिया आपकी स्क्रीन को मार रही है, तो इसे 'मृत' के रूप में सूचीबद्ध किया जाना चाहिए, लेकिन गायब नहीं होना चाहिए। मुझे यकीन नहीं है कि यह क्या हो सकता है।
1

1
@ qräbnö: अच्छी पकड़! यह सब समय और मैंने इसे नोटिस नहीं किया। मैंने उसी हिसाब से जवाब अपडेट किया।
लेप

20

निम्न आदेश स्क्रीन संस्करण 4.06.02 के लिए काम करता है:

screen -L -Logfile Log_file_name_of_your_choice command_to_be_executed

स्क्रीन के मैन पेज से :

-Logfile file : By default logfile name is "screenlog.0".
                You can set new logfile name with the "-Logfile" option.

आप स्क्रीन के मौजूदा संस्करण को स्क्रीन- वर्जन का उपयोग करके देख सकते हैं । आप https://www.gnu.org/software/screen/ से नवीनतम स्क्रीन संस्करण डाउनलोड और इंस्टॉल कर सकते हैं ।


इसके अलावा आप कमांड के रूप में छोड़ सकते हैं_बेटे को खाली छोड़ दें और लंबे समय तक चलने वाली नौकरियों की एक श्रृंखला में प्रवेश करें
1911

याद रखें कि स्क्रीन की वर्किंग डाइरेक्टरी को लिखने की अनुमति है, क्योंकि अन्यथा यह चुपचाप विफल हो जाता है (बस बिना किसी चेतावनी के प्रवेश नहीं करता है)
15

15

मैक टर्मिनल के लिए:

script -a -t 0 out.txt screen /dev/ttyUSB0 115200

विवरण

  • script: एक अंतर्निहित आवेदन "टर्मिनल सत्र का एक प्रकार बनाने के लिए"
  • -a: आउटपुट फ़ाइल में जोड़ें
  • -t 0: आउटपुट फ़ाइल में लिखने के बीच का समय 0 सेकंड है, इसलिए हर नए वर्ण के लिए आउट.टैक्स अपडेट किया जाता है
  • out.txt: सिर्फ आउटपुट फ़ाइल नाम है
  • screen /dev/ttyUSB0 115200: बाहरी डिवाइस से कनेक्ट करने के लिए प्रश्न से कमांड

फिर आप यह देखने के लिए पूंछ का उपयोग कर सकते हैं कि फाइल अपडेट हो रही है।

tail -100 out.txt

1
यह मेरे लिए एक मैक पर काम नहीं किया। लॉग फ़ाइल आम और कमांड को समाप्त करने वाली स्क्रिप्ट को दिखाती है, लेकिन स्क्रीन कमांड से प्राप्त डेटा नहीं।
डेविड

10

Ctrl+Aफिर Shift+Hमेरे लिए काम करता है। screenlog.0जब प्रोग्राम चल रहा हो तब आप फ़ाइल देख सकते हैं ।


1
Ctrl + A तत्कालीन H।
शिमोन डूडकिन

1
@ShimonDoodkin मैंने कोशिश की, किसी कारण के लिए डेबियन पर काम नहीं करता है। हालांकि दूसरों के लिए उपयोगी हो सकता है। धन्यवाद!
१:04

5

यूनिक्स के तहत 'स्क्रिप्ट' कमांड को चाल चलनी चाहिए। बस इसे अपने नए कंसोल की शुरुआत में चलाएं और आपको अच्छा होना चाहिए।


महान! इसे कहां छपता है?
एडोआर्डू

यह सिर्फ एक फ़ाइल को लिखना चाहिए। कमांड थोड़ा गड़बड़ है लेकिन मुझे लगता है कि यह थोड़ा हल हो सकता है: linux.byexamples.com/archives/279/…
Ruben

5

यहाँ एक चाल है: इसे में लपेटो sh -c!

screen sh -c './some-script 2>&1 | tee mylog.log'

जहाँ 2>&1Stdr को stdout पर पुनर्निर्देशित करता है ताकि teeत्रुटि संदेश पकड़ और लॉग कर सके।


5

निम्नलिखित उपयोगी हो सकता है (लिनक्स / Ubuntu 12.04 (सटीक पैंगोलिन) पर परीक्षण किया गया ):

cat /dev/ttyUSB0

उपरोक्त का उपयोग करना, फिर आप उन सभी पुन: दिशाओं को कर सकते हैं जिनकी आपको आवश्यकता है। उदाहरण के लिए, अपनी फ़ाइल में सहेजते समय अपने कंसोल पर आउटपुट डंप करने के लिए, आप यह करेंगे:

cat /dev/ttyUSB0 | tee console.log

इसने मेरे लिए पूरी तरह से काम किया। मैं एक Arduino डेटा कैप्चर सत्र से सीरियल मॉनीटर आउटपुट लॉग कर रहा हूं।
इयान पिट्स

3

एक अलग उत्तर यदि आपको पहले से सक्रिय रूप से चलने वाली स्क्रीन से अपने पूरे स्क्रॉलबैक बफर के आउटपुट को बचाने की आवश्यकता है:

Ctrl-a [ g SPACE G $ >.

यह आपके पूरे बफर को / tmp / screen-exchange पर बचाएगा


2

मौजूदा स्क्रीन लॉग को इससे बचाया जा सकता है:

Ctrl+A : हार्डकॉपी -एच फाइलन

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