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


49

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

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

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


1
क्या आप कृपया मेरी (और @cnst की) "बहस" पर एक नज़र डाल सकते हैं, मैं आपको केवल उसी चीज़ का अनुमान लगा रहा हूं, जो आउटपुट को उसी समय देखना है जैसे किसी फ़ाइल में लॉग करना। अगर आपको कोई हल मिला, तो हमें इसके बारे में बताएं;)
बेंज

जवाबों:


52

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

यह बफ़र stdoutएक लाइन तक:

stdbuf -oL command > output

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

stdbuf -o0 command > output

aarghhh ... मेरे उबंटू में केवल 7.4
कोर्यूटिल हैं

@ कैलेमरियस: कम्पाइलिंग कोरुटिल्स काफी आसान होना चाहिए। बस ftp.gnu.org/gnu/coreutils से एक नया संस्करण ले लो और इसे जाने दो। यह मानक ./configure && makeकिराया है। आपको इसे बाद में स्थापित करने की आवश्यकता नहीं है, आप बस stdbufबाइनरी का उपयोग कर सकते हैं src/
एडुआर्डो इवानेक

डबल आर्ग। मुझे पुराने सेंट्रो डिस्ट्रो और ओएसएक्स के साथ-साथ उबंटू पर भी इसकी आवश्यकता है।
edk750


क्या ज्ञात पीआईडी ​​के साथ पहले से चल रही प्रक्रिया के लिए पाइप / प्रिंटफ बफ़र्स को बाहरी रूप से बाध्य करने का एक तरीका है?
मेविसेक

9

आप 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

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

8

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

unbuffer your_command

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


6

सबसे आसान समाधान जो मुझे मिला (जिसे किसी भी तृतीय-पक्ष पैकेज स्थापित करने की आवश्यकता नहीं है) यूनिक्स और लिनक्स साइट पर एक समान थ्रेड में उल्लेख किया गया था : 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

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


मुझे 'स्क्रिप्ट -a out.txt' ट्रिक का पता है। मैं सोच रहा था कि क्या लेखन प्रक्रिया को बफर बनाने के लिए कोई और तरीका नहीं है।
जेम्स डीन

3

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

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


मैं भी कमांड लाइन में "कम है" जोड़ देगा।
HUB

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

2

आउटपुट को किसी फ़ाइल में रीडायरेक्ट करें और tail -fकमांड के साथ फाइल को फॉलो करें ।

संपादित करें

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


3
यह वही है जो मैं अभी करता हूं, लेकिन प्रक्रिया फ़ाइल को लिखती है और यही वह है जिससे मैं बचना चाहता हूं।
जेम्स डीन

अद्यतन प्रस्ताव के लिए मेरा संपादन देखें।
wolfgangsz

1
यह स्पष्ट कारणों से काम नहीं करता है। कौन This answer is usefulजवाब देने के लिए बाहर निकलता है जो काम नहीं करता है, और संभवतः काम नहीं कर सकता है?
cnst

1

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

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


काम नहीं करता है। teeकिसी भी बफरिंग को होने से नहीं रोकेंगे।
CNST

1
@ प्रभावी रूप से, teeकुछ बफ़रिंग से बचना नहीं होगा , लेकिन केवल आपको आउटपुट पर एक नज़र रखने की अनुमति देगा। यह वही है जो @JamesDean चाहता था (जैसा कि मैंने उसके सवाल को समझा), लेकिन मुझे लगता है कि बफरिंग वास्तव में यहाँ समस्या नहीं है। यदि आपके पास अधिक विवरण हैं, तो मुझे बताएं।
बेन्ज

वह आउटपुट देखना चाहता था, और उसे कोई आउटपुट नहीं मिल रहा था (असंबद्ध तरीके से), और फिर भी आप teeआउटपुट पर एक बेहतर दृश्य प्राप्त करने के लिए उपयोग करने का सुझाव देते हैं जो कि नहीं मिल रहा है?
cnst

1
मैं @JamesDean को कैसे लाल करूं: "मैं किसी फ़ाइल '> out.txt' के लिए आउटपुट पर रीडायरेक्ट करता हूं" मेरे लिए कोई कंसोल आउटपुट नहीं है, प्रक्रिया के पूरा होने तक प्रतीक्षा करें जबकि पूरा आउटपुट रीडायरेक्ट हो गया है। जब आप उपयोग कर रहे >हैं तो आपको कंसोल पर कुछ भी दिखाई नहीं दे रहा है। मुझे लगता है कि @JamesDean वर्णन करने के लिए "बफ़रिंग" शब्द का उपयोग कर रहा है। मैं उसके सवाल पर एक टिप्पणी पोस्ट करूंगा कि वह क्या चाहता है।
बेंज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.