मैं एक प्रोग्राम डिबग करने की कोशिश कर रहा हूं जो बहुत अधिक डेटा उत्पन्न करता है। लेकिन जिस घटना को मैं डिबग करना चाहता हूं वह यादृच्छिक समय के बाद होता है (मैं इसे बाध्य नहीं कर सकता)। इसलिए मुझे अपने शेल में स्टडआउट और स्टाडर देखना होगा और आगे के विश्लेषण और व्यवधान के लिए एक ही आउटपुट को एक फाइल में सेव करना होगा जैसे ही मुझे यह दिखाई देगा कि मुझे अपने शेल आउटपुट पर क्या चाहिए।
मुझे इस 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, हालांकि इसके बाद शुरू हुई। तो यह वास्तव में कुछ अजीब उत्पादन जादू की तरह लग रहा है।
printपायथन (2.7.5) का बयान है।
teeऔरscriptकार्यक्रम के उत्पादन पर कब्जा नहीं कर रहे हैं, तो कार्यक्रम कुछ और "चालाक" से सिर्फ stdout / stderr को लिखने कर रहे होंगे। यह लिखने के लिए हो सकता है / dev / tty, या यह अपने व्यवहार को बदल सकता है जब stdout / stderr एक TTY नहीं है।