क्या एक शेल स्क्रिप्ट में सभी गतिविधि को लॉग करने का एक आसान तरीका है?


18

क्या शेल स्क्रिप्ट से फ़ाइल में होने वाली सभी गतिविधि को लॉग करने का एक आसान तरीका है?

मेरे पास एक स्क्रिप्ट है। यह इको "निर्देश", साथ ही साथ अन्य प्रोग्राम आउटपुट जैसी चीजों को आउटपुट करता है। मैं आज्ञाओं को जानता हूं:

command | tee -a "$log_file"

तथा

command >> logifle.log

मैं क्या पूछ रहा हूं कि क्या लॉगिंग के लिए एक शेल पैरामीटर है, या एक सेट कमांड जिसका मैं उपयोग कर सकता हूं या ऐसा कुछ। यदि मुझे नहीं करना है, तो मुझे जरूरी नहीं कि दर्जनों रीडायरेक्ट्स या टीज़ को फाइलों में जोड़ा जाए। मैं अभी भी एसटीडी आउटपुट प्राप्त करना चाहता हूं - मैं यह भी चाहता हूं कि इसे लॉग इन किया जाए ।:q


5
LOL: wq जैसे मैं विम में था
j0h

1
यह मेरे दिमाग को चकित कर देता है कि ज्यादातर लोग ऐसा करने लगते हैं: x
क्षमा करें और मोनिका

जवाबों:


18

यदि आप सामान्य रूप से अपनी स्क्रिप्ट चलाते हैं foo.sh, तो इसे चलाने की कोशिश करें (यह एक बैश स्क्रिप्ट है) bash -x foo.sh। यदि आप चाहते हैं कि सब कुछ फ़ाइल में रीडायरेक्ट हो जाए, तो प्रयास करें bash -x foo.sh > file.log 2>&1(ध्यान दें कि मैं stderr को पुनर्निर्देशित कर रहा हूं, 2>&1यदि आप ऐसा नहीं चाहते हैं तो हटा दें )। तुम भी देखने के लिए क्या हो रहा है चाहते हैं, bash -x foo.sh 2>&1 | tee log.file


20

एक बहुत ही आसान और आसान तरीका है:

scriptटर्मिनल सत्र के टाइपस्क्रिप्ट बनाने के लिए उपयोग करना

  1. कमांड शुरू करें script

    यदि तर्क fileदिया जाता है, उदाहरण के लिए script ~/tmp/output, scriptइस फ़ाइल में संवाद सहेजता है। यदि कोई फ़ाइल नाम नहीं दिया गया है, तो संवाद फ़ाइल में सहेजा गया हैtypescript

  2. अपनी स्क्रिप्ट शुरू करें या कभी भी जो आप शुरू करना चाहते हैं

  3. यदि आपकी स्क्रिप्ट समाप्त हो गई है, तो इसके scriptमाध्यम से रोकें Ctrl-D

  4. डिफ़ॉल्ट आउटपुट फ़ाइल में आउटपुट की जाँच करें typescript


के साथ एक चरण में अपनी कमांड शुरू करने के लिए script, पैरामीटर का उपयोग करें-c

-c COMMAND
    Run the COMMAND rather than an interactive 
    shell. This makes it easy for a script to capture
    the output of a program that behaves differently
    when its stdout is not a tty.

scriptआपकी स्क्रिप्ट के अंदर के उपयोग का कोई मतलब नहीं है क्योंकि scriptशेल खोल देता है या एक नया शेल शुरू करता है।

यदि चर शेल मौजूद है, तो स्क्रिप्ट द्वारा खोल दिया गया शेल वह शेल होगा। यदि शेल सेट नहीं है, तो बॉर्न शेल ग्रहण किया जाता है। (अधिकांश गोले इस चर को स्वचालित रूप से सेट करते हैं)।


4
@ फब्बी मुझे अपना जवाब पसंद है, लेकिन मुझे छोटी ग्रे चीज़ नहीं दिखती;)
एबी

मैं उपयोग करता हूं script logfilename, इसलिए मैं इसे लेने के लिए मिलता हूं।
वाल्टिनेटर

क्या मैं अपने शेल प्रोग्राम से "स्क्रिप्ट" कह सकता हूं?
jhh

1
इसका कोई मतलब नहीं है, मेरा बेहतर जवाब देखें।
AB

1
+1। इस उत्तर के लिए धन्यवाद :-) scriptउपयोगी भी है एक पंद्रह के माध्यम से निगरानी। से man script: " -f, --flushप्रत्येक लिखने के बाद फ्लश आउटपुट। यह टेलिस्कोप के लिए अच्छा है: एक व्यक्ति करता है mkfifo foo; script -f foo, और दूसरा वास्तविक समय की निगरानी कर सकता है कि इसका उपयोग क्या किया जा रहा है cat foo"। यह तब भी मॉनिटर करने के लिए उपयोग किया जा सकता है जब कोई प्रोग्राम इनपुट की प्रतीक्षा कर रहा है या उदाहरण के लिए किया गया है, जो पंद्रहवें के टाइमस्टैम्प की निगरानी करके किया गया है।
सूडोडस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.