आउटपुट को देखने के दौरान स्टडआउट और स्टीडर को फ़ाइल में कैसे बचाया जाए?


0

मैं एक प्रोग्राम डिबग करने की कोशिश कर रहा हूं जो बहुत अधिक डेटा उत्पन्न करता है। लेकिन जिस घटना को मैं डिबग करना चाहता हूं वह यादृच्छिक समय के बाद होता है (मैं इसे बाध्य नहीं कर सकता)। इसलिए मुझे अपने शेल में स्टडआउट और स्टाडर देखना होगा और आगे के विश्लेषण और व्यवधान के लिए एक ही आउटपुट को एक फाइल में सेव करना होगा जैसे ही मुझे यह दिखाई देगा कि मुझे अपने शेल आउटपुट पर क्या चाहिए।

मुझे इस scriptआदेश पर उबंटू धागा मिला, लेकिन मैं इसे काम करने के लिए नहीं कह सकता, स्क्रिप्ट कहती है:

$ script "./client -p 4242 -n test"
Script started, output file is ./client -p 4242 -n test

और फिर बाहर निकल जाता है। फ़ाइल में है:

Script started on Thu Jun 26 13:51:12 2014

Script done on Thu Jun 26 13:51:12 2014

तो scriptकाम नहीं करता है./clientफ़ाइल एक अजगर स्क्रिप्ट है। मैंने इसे लॉन्च करने की भी कोशिश की $ python client -p 4242 -n testलेकिन यह भी काम नहीं कर रहा है।

मैंने उसी धागे पर कुछ उत्तरों के साथ teeऔर एक पाइप को भी देखा, लेकिन मैं इसे अपने शेल के आउटपुट के लिए नहीं पा सकता हूं और देख सकता हूं कि क्या चल रहा है:

$ ./client -p 4242 -n test | tee output.log

मुझे कुछ नहीं होने के बिना एक प्रतीक्षा कर्सर देता है। तो teeकाम नहीं करता है

क्या कोई और उपाय है या क्या मैं कुछ समय के बाद कार्यक्रम को रुकने और बाधित करने के लिए तैयार हूं और आशा करता हूं कि यह उस घटना से गुजरेगा जिसकी मुझे तलाश है?

आपकी मदद के लिए बहुत बहुत धन्यवाद!

PS मैं zshell पर हूं (ओह-माय-zsh के साथ), मैक OSX 10.9.3, पायथन 2.7.5

संपादित करें: मुझे उल्लेख करना पड़ सकता है कि मैं multiprocessingमॉड्यूल का उपयोग कर रहा हूं और ./clientस्क्रिप्ट कई अन्य Processes को लॉन्च करती है । क्या यह उस कारण से हो सकता है? फिर भी मुझे समझ नहीं आ रहा है कि यह ./clientप्रक्रिया आउटपुट को क्यों नहीं पकड़ेगी ...

EDIT2: मैंने नीचे माटेयो से उत्तर की कोशिश की (आपकी मदद के लिए बहुत बहुत धन्यवाद) और यह अजनबी और अजनबी बना रहा है:

यदि प्रक्रिया विफल हो जाती है (सर्वर शटडाउन है), तो मैं आउटपुट देख सकता हूं:

$ ./client -p 4242 -n test 2>&1 | tee output.log
Process Process-1:
Client # 1: Could not connect to server. Stopping.
Spawner: New client # 1 started...
Done.
$

लेकिन अगर ऐसा लगता है कि यह चल रहा है, तो मुझे कुछ नहीं दिखता:

$ ./client -p 4242 -n test 2>&1 | tee output.log
^C [voluntary interrupt after a lot of waiting]
$ cat output.log
$ 

ऊपर दिए गए लॉग में (जहां यह विफल रहता है), आप देख सकते हैं कि नई प्रक्रिया मुख्य एक ( ) से पहले प्रिंट करती है Spawner, हालांकि इसके बाद शुरू हुई। तो यह वास्तव में कुछ अजीब उत्पादन जादू की तरह लग रहा है।


तो teeऔर scriptकार्यक्रम के उत्पादन पर कब्जा नहीं कर रहे हैं, तो कार्यक्रम कुछ और "चालाक" से सिर्फ stdout / stderr को लिखने कर रहे होंगे। यह लिखने के लिए हो सकता है / dev / tty, या यह अपने व्यवहार को बदल सकता है जब stdout / stderr एक TTY नहीं है।
केनस्टर

एकमात्र फ़ंक्शन जो मैं उपयोग कर रहा हूं वह printपायथन (2.7.5) का बयान है।
achedeuzot

जवाबों:


2

आप मानक त्रुटि को मानक आउटपुट पर पुनर्निर्देशित कर सकते हैं और फिर teeमानक आउटपुट को डुप्लिकेट करने के लिए उपयोग कर सकते हैं और इसे एक फ़ाइल में संग्रहीत कर सकते हैं।

$ ./client -p 4242 -n test 2>&1  | tee output.log

संपादित करें : आप द्वारा कमांड का प्रयास कर सकते हैं

$ ( echo "stdout" ; echo "stderr" 1>&2 ) 2>&1  | tee output.log

दोनों echoएस स्टडआउट और स्टैडर पर आउटपुट का उत्पादन करते हैं। आपको दोनों को देखना चाहिए, और उसी मेंoutput.log

संपादित करें

अपने कार्यक्रम (फ्लश) को संशोधित करने के बजाय आप पाइप में बफरिंग बफ़र मेंscript -q बताए गए कई अन्य उपकरण भी आज़मा सकते हैं


मैंने यह कोशिश की क्योंकि यह उबंटू धागे में सुझाया गया था लेकिन जब मैं इसे आज़माता हूं तो शेल पर कोई आउटपुट नहीं होता है। और output.log फ़ाइल खाली है! मुझे समझ नहीं आता क्यों: / क्या यह अजगर 2.7 "प्रिंट" बयान है?
achedeuzot

1
@ मैटो का उत्तर सामान्य तरीका है जो आपने पूछा है। यह संभव है कि यह "क्लाइंट" प्रोग्राम अलग तरह से व्यवहार करता है जब stdout / stderr एक TTY नहीं है।
केनस्टर

BTW I ने zsh के साथ OS X 10.9.3 पर परीक्षण किया और यह वर्णित अनुसार व्यवहार कर रहा है।
मट्टियो

आपकी सहायता के लिए बहुत - बहुत धन्यवाद। दुर्भाग्य से, यह अधिक से अधिक अजीब हो रहा है (दूसरा संपादन देखें)। अगर किसी को पता है कि यह कहाँ से आ रहा है (अजगर? मल्टीप्रो?) में कुछ और इंतजार करूँगा।
15 दिसंबर को साढ़े

आपका उत्तर "सामान्य मामले" में सही है। लेकिन कुछ विशिष्टताओं (पायथन मल्टीप्रोसेसिंग मॉड्यूल) के कारण मेरे लिए काम नहीं किया।
15 नवंबर को अच्युजुजोत

1

विजय !

जैसा कि प्रश्न में उल्लेख किया गया है, मैं multiprocessing.Processमुख्य ग्राहक से नई प्रक्रियाओं को स्पॉन करने के लिए अजगर का उपयोग कर रहा था । उस वजह से, आउटपुट बफर हो गया था और बफर के फ्लशिंग से पहले पूरा होने का इंतजार कर रहा था लेकिन ऐसा लगता है कि यह | teeकमांड के साथ कभी नहीं होता है । इस प्रकार कभी भी कुछ भी नहीं प्रिंट करना और अंतहीन इंतजार करना।

इस प्रकार, समाधान केsys.stdout.flush()print रूप में यहाँ वर्णित प्रत्येक कथन के बाद जोड़ना है :

print "Player # " + int(self.id) + " joined the map"
sys.stdout.flush() #<==== THIS MAKES IT ALL WORK !

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

$ ./client -p 4242 -n test 2>&1  | tee output.log`
$ cat output.log
Player # 1 joined the map.
Player # 1 updated it's inventory.
[...]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.