सवाल यूनिक्स / लिनक्स पर बफर किए बिना आउटपुट को फ़ाइल में रीडायरेक्ट करने का कोई तरीका है?


मेरे पास एक लंबी दौड़ वाली बैच प्रक्रिया है जो कुछ डीबग और प्रोसेस जानकारी को stdout पर आउटपुट करती है। अगर मैं सिर्फ टर्मिनल से चलता हूं तो मैं 'यह कहां है' का ट्रैक रख सकता हूं लेकिन फिर डेटा बहुत अधिक हो जाता है और स्क्रीन से स्क्रॉल हो जाता है।

अगर मैं आउटपुट में '> out.txt' फ़ाइल पर रीडायरेक्ट करता हूं तो मुझे अंततः पूरा आउटपुट मिलता है लेकिन यह बफर किया जाता है, इसलिए मैं अब यह नहीं देख सकता कि यह अभी क्या कर रहा है।

क्या आउटपुट को रीडायरेक्ट करने का कोई तरीका है लेकिन इसे अपने लेखन को बफर नहीं करना है?


46
2017-07-26 14:34


मूल


क्या आप नीचे मेरी (और @cnst की) "बहस" पर एक नज़र डालें, मैं अनुमान लगा रहा हूं कि आप एक ही चीज को एक फ़ाइल में लॉगिंग के रूप में आउटपुट देखना चाहते हैं। यदि आपको कोई समाधान मिला है, तो हमें इसके बारे में बताएं;)! - Benj
अधिक उग्र सवाल unix.stackexchange.com/questions/25372 - Trevor Boyd Smith


जवाब:


आप स्पष्ट रूप से मानक स्ट्रीम के बफरिंग विकल्पों को एक का उपयोग कर सेट कर सकते हैं setvbuf सी में कॉल (देखें यह लिंक), लेकिन यदि आप किसी मौजूदा प्रोग्राम के व्यवहार को संशोधित करने का प्रयास कर रहे हैं stdbuf (का हिस्सा coreutils जाहिर है संस्करण 7.5 के साथ शुरू)।

यह बफर stdout एक पंक्ति तक:

stdbuf -oL command > output

यह अक्षम करता है stdout बफरिंग पूरी तरह से:

stdbuf -o0 command > output

46
2017-07-27 15:41



aaarghhh ... मेरे उबंटू केवल 7.4 coreutils है ... :( - Calmarius
@ कालारियस: कोर्यूलिल संकलन काफी आसान होना चाहिए। बस से एक नया संस्करण पकड़ो ftp.gnu.org/gnu/coreutils और इसे जाने दो। यह मानक है ./configure && make किराया। आपको इसे बाद में स्थापित करने की भी आवश्यकता नहीं है, आप बस इसका उपयोग कर सकते हैं stdbuf बाइनरी बंद src/। - Eduardo Ivanec
डबल अरग मुझे इसे पुराने सेंटोस डिस्ट्रो और ओएसएक्स के साथ-साथ उबंटू पर भी चाहिए। - edk750
अधिक उल्लिखित जवाब unix.stackexchange.com/a/25378/5510 - Trevor Boyd Smith


आप लाइन का उपयोग करके फ़ाइल में buffered आउटपुट प्राप्त कर सकते हैं script ऐसा आदेश:

stty -echo -onlcr   # avoid added \r in output
script -q /dev/null batch_process | tee output.log        # Mac OS X, FreeBSD
script -q -c "batch_process" /dev/null | tee output.log   # Linux
stty echo onlcr

8
2018-01-31 15:13



-1 क्योंकि: ए) स्वीकार्य उत्तर के विपरीत यह काम नहीं करता है अगर आप पृष्ठभूमि में कमांड चलाने के लिए चाहते हैं (आदेश तुरंत समाप्त किए बिना समाप्त हो जाता है batch_process अगर आप संलग्न करते हैं & उपरोक्त आदेश के लिए, कम से कम मेरे लिनक्स बॉक्स पर), जो एक बेहद आम उपयोग मामले की तरह लगता है, और बी) इस उत्तेजना के काम के बारे में कोई स्पष्टीकरण नहीं है। - Mark Amery


उबंटू पर, unbuffer कार्यक्रम (से expect-dev) पैकेज मेरे लिए चाल थी। बस दौडो:

unbuffer your_command 

और यह इसे बफर नहीं करेगा।


7
2018-02-18 11:48





मुझे मिला सबसे आसान समाधान (किसी तीसरे पक्ष के पैकेज की आवश्यकता नहीं है) पर एक समान धागे में उल्लिखित किया गया था यूनिक्स और लिनक्स साइट: का प्रयोग करें script आदेश। यह पुराना है, और संभवतः पहले से स्थापित है।

$ script -q /dev/null long_running_command | print_progress       # FreeBSD, Mac OS X
$ script -q -c "long_running_command" /dev/null | print_progress  # Linux

ध्यान दें कि के लिए पहला फ़ाइल नाम पैरामीटर script कमांड लॉग फ़ाइल होने के लिए है। यदि आप बस भागते हैं script -q your_command, आप लॉग फ़ाइल के साथ चलाने के लिए इंडेंट किए गए कमांड को ओवरराइट कर देंगे। चेक man scriptकोशिश करने से पहले, सुरक्षित होने के लिए।


4
2018-04-17 03:57





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


2
2017-07-26 14:49



मैं 'script -a out.txt' चाल के बारे में जानता हूं। मैं सोच रहा था कि लेखन प्रक्रिया को बफर नहीं करने का कोई अन्य तरीका है या नहीं। - James Dean


व्यक्तिगत रूप से मैं एक कमांड के पाइपिंग आउटपुट को पसंद करता हूं जिसे मैं जांचना चाहता हूं tee

script प्रमुख प्रेस के समय सहित बहुत अधिक जानकारी रिकॉर्ड करता है, और बहुत सारे गैर-प्रिंट करने योग्य पात्र। क्या tee बचाता है मेरे लिए ज्यादा मानव पठनीय है।


2
2017-07-26 14:51



मैं कमांड लाइन में "| कम" भी जोड़ूंगा। - HUB
मुझे यकीन है कि tee बफरिंग से भी प्रभावित होता है। आउटपुट को विभाजित करते समय मुझे अक्सर टी द्वारा प्रदर्शित आंशिक रेखाएं मिलती हैं find आदेश देता है। - Magellan


आउटपुट को एक फ़ाइल में रीडायरेक्ट करें और फ़ाइल का पालन करें tail -f आदेश।

संपादित करें

यदि यह अभी भी बफरिंग से पीड़ित है, तो syslog सुविधा का उपयोग करें (जो आम तौर पर unbuffered है)। यदि बैच प्रक्रिया शेल स्क्रिप्ट के रूप में चलती है, तो आप ऐसा करने के लिए लॉगर कमांड का उपयोग कर सकते हैं। यदि बैच नौकरी एक स्क्रिप्टिंग भाषा में चलती है, तो वैसे भी एक लॉगिंग सुविधा होनी चाहिए।


1
2017-07-26 16:47



यह वही है जो मैं अभी करता हूं लेकिन प्रक्रिया फाइल को लिखती है और यही वह है जिसे मैं टालना चाहता हूं। - James Dean
एक अद्यतन प्रस्ताव के लिए मेरा संपादन देखें। - wolfgangsz
यह स्पष्ट कारणों से काम नहीं करता है। कौन नरक देता है This answer is useful उन उत्तरों के लिए जो काम नहीं करते हैं, और संभवतः काम नहीं कर सकते हैं? - cnst


आप इसका उपयोग कर सकते हैं tee आदेश, बस जादू!

someCommand | tee logFile.log मर्जी दोनों कंसोल में प्रदर्शित करें और लॉग फ़ाइल में लिखें।


0
2018-04-26 12:32



काम नहीं करता tee किसी भी बफरिंग को होने से नहीं रोकेगा। - cnst
@cnst प्रभावी रूप से, tee कुछ बफरिंग से बच नहीं पाएंगे, बल्कि आपको आउटपुट के बारे में एक नज़र डालने की अनुमति होगी। यही वह है जो @ जेम्स डीन चाहता था (जैसा कि मैंने अपने प्रश्न को कम किया), लेकिन मुझे लगता है कि बफरिंग वास्तव में यहां समस्या नहीं है। यदि आपके पास अधिक जानकारी है, तो मुझे बताएं। - Benj
वह आउटपुट देखना चाहता था, और उसे कोई आउटपुट नहीं मिला (एक अप्रचलित तरीके से), और फिर भी आप इसका उपयोग करने का सुझाव देते हैं tee उस आउटपुट पर बेहतर दृश्य प्राप्त करने के लिए जिसे कोई नहीं मिल रहा है? - cnst
मैं लाल @ जेम्स डीन सवाल कैसे करता हूं: "मैं आउटपुट पर एक फ़ाइल '> out.txt' पर रीडायरेक्ट करता हूं" मेरे लिए कोई कंसोल आउटपुट नहीं है, पूरे आउटपुट को रीडायरेक्ट करते समय प्रक्रिया पूरी होने की प्रतीक्षा करें। जब आप उपयोग कर रहे हैं > आप कंसोल पर कुछ भी नहीं देखते हैं। मुझे लगता है कि @ जेम्स डीन इसका वर्णन करने के लिए "बफरिंग" शब्द का उपयोग कर रहे हैं। मैं उनके प्रश्न पर एक टिप्पणी पोस्ट करूंगा कि वह जो चाहें उसके बारे में और कहें। - Benj