मैं पूरी तरह से सभी बैश स्क्रिप्ट क्रियाओं को कैसे लॉग इन कर सकता हूं?


44

मैं अपने स्क्रिप्ट आउटपुट से त्रुटि संदेशों के साथ सभी लॉग डेटा को कैप्चर करना चाहता हूं, और उन सभी को लॉग फाइल में रीडायरेक्ट करना चाहता हूं।

मेरे पास नीचे की तरह स्क्रिप्ट है:

#!/bin/bash
(
echo " `date` : part 1 - start "
ssh -f admin@server.com 'bash /www/htdocs/server.com/scripts/part1.sh logout exit'
echo " `date` : sleep 120"
sleep 120
echo " `date` : part 2 - start"
ssh admin@server.com 'bash /www/htdocs/server.com/scripts/part2.sh logout exit'
echo " `date` : part 3 - start"
ssh admin@server.com 'bash /www/htdocs/server.com/scripts/part3.sh logout exit'
echo " `date` : END"
) | tee -a /home/scripts/cron/logs

मैं सभी कार्यों को फ़ाइल में देखना चाहता हूं /home/scripts/cron/logs

लेकिन मैं इसे केवल वही देखता हूं जो मैंने इको कमांड के बाद रखा था।

लॉग में जांच कैसे करें एसएसएच कमांड सफल था?

मुझे सभी लॉग डेटा इकट्ठा करने की आवश्यकता है। मुझे अपनी स्क्रिप्ट में प्रत्येक कमांड के परिणाम की निगरानी करने की आवश्यकता है, ताकि स्क्रिप्ट विफल होने पर बेहतर विश्लेषण हो सके।


आप इसे करने के लिए "स्क्रिप्ट" का भी उपयोग कर सकते हैं। इस पोस्ट को देखें: [यहाँ] [१] [१]: stackoverflow.com/questions/5985060/…
xX0v0Xx

आपको एरेक्सिट के साथ सावधान रहना चाहिए - मैंने देखा कि इसे अनदेखा किया गया है या त्रुटि स्क्रिप्ट से बाहर नहीं निकलती है। अगर आपके पास स्क्रिप्ट में ऐसा कुछ है: कमांड || dosmthg जब कमांड फेल हो जाती है तो स्क्रिप्ट तुरंत एरेक्सिट सेट से बाहर नहीं निकलती है, लेकिन बस dosmthg चलाएं और स्क्रिप्ट जारी रखें

जवाबों:


66

मैं आम तौर पर हर स्क्रिप्ट की शुरुआत में निम्नलिखित के समान कुछ रखता हूं (खासकर अगर यह डेमन के रूप में चलेगा):

#!/bin/bash
exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>log.out 2>&1
# Everything below will go to the file 'log.out':

स्पष्टीकरण:

  1. exec 3>&1 4>&2

    फ़ाइल विवरणकों को सहेजता है ताकि वे पुनर्निर्देशन से पहले जो कुछ भी थे, उन्हें बहाल किया जा सके या निम्न रीडायरेक्ट से पहले जो कुछ भी वे थे, उसका उत्पादन करने के लिए खुद को इस्तेमाल किया जा सके।

  2. trap 'exec 2>&4 1>&3' 0 1 2 3

    विशेष संकेतों के लिए फ़ाइल डिस्क्रिप्टर को पुनर्स्थापित करें। आम तौर पर आवश्यक नहीं है क्योंकि उप-शेल से बाहर निकलने पर उन्हें बहाल किया जाना चाहिए।

  3. exec 1>log.out 2>&1

    पुन: निर्देशित stdoutफाइल करने के लिए log.outतो अनुप्रेषित stderrकरने के लिए stdout। ध्यान दें कि जब आप उन्हें एक ही फ़ाइल पर ले जाना चाहते हैं तो ऑर्डर महत्वपूर्ण है। stdout चाहिए से पहले पुनः निर्देशित किया stderrपर भेज दिया जाएगा stdout

तब से, कंसोल (शायद) पर आउटपुट देखने के लिए, आप बस पुनर्निर्देशित कर सकते हैं &3। उदाहरण के लिए,

echo "$(date) : part 1 - start" >&3

जहां कहीं भी stdoutनिर्देशित किया गया था, संभवतः सांत्वना, ऊपर 3 लाइन निष्पादित करने से पहले जाएगी।


<< नाईसूट, धन्यवाद! मैंने स्क्रिप्ट की शुरुआत में उन थ्रेडलाइनों (निष्पादन, ट्रैप, निष्पादन) को जोड़ा और मैं स्टैडआउट और स्टडर दोनों प्राप्त करने में सक्षम हूं। लेकिन एक मुद्दा: मैंने "फ़ाइल डिस्क्रिप्टर 3 (पाइप: एक्सएक्सएक्स) कुछ_कमांड पर लीक देखा है ..." कृपया मुझे बताएं कि मैं इन त्रुटियों को प्राप्त करने से कैसे बच सकता हूं। मैं कस्टम बोर्ड में बिजीबॉक्स आधारित श का उपयोग कर रहा हूं।
कुमार

3
ग्रेट कुंगफू यहाँ !!! - और भी बेहतर उपयोग करना है trap 'exec 2>&4 1>&3' 0 1 2 3 RETURN। RETURN छद्म sigspec फ़ाइल विवरणकों को हर बार शेल फ़ंक्शन या स्क्रिप्ट को निष्पादित करने के लिए पुनर्स्थापित करता है। या स्रोत बिल्‍डिंग का कार्य पूरा करना। इसके लिए (और अन्य कारणों से) अपनी लिपियों में मैं अंतिम 2 पंक्तियों के रूप में जोड़ता हूं: return& exit 0- बस मेरे 2 सेंट, आपके लिए kudos @nicerobot!
दावालपी

शेल के वैश्विक वेरिबल्स के माध्यम से शेल स्क्रिप्ट के लिए लॉगिंग पर विस्तार की अच्छी मात्रा है। हम शेल स्क्रिप्ट में लॉगिंग के समान प्रकार का अनुकरण कर सकते हैं: cubicrace.com/2016/03/efficient-logging-mechnism-in-shell.html पोस्ट में INFO, DEBUG, ERROR जैसे लॉग स्तरों का परिचय देने पर विवरण है। स्क्रिप्ट प्रविष्टि, स्क्रिप्ट निकास, फ़ंक्शन प्रविष्टि, फ़ंक्शन निकास जैसे अनुरेखण विवरण।
पीयूष चोरडिया

trapसंकेतों की गणना थोड़ी अजीब लगती है। आमतौर पर आप भी शामिल करना चाहते हैं 15
ट्रिपल


14

अपने logfile के लिए ssh आउटपुट पाने के लिए, आपको रीडायरेक्ट stderrकरना होगा stdout। आप इसे 2>&1अपने बैश स्क्रिप्ट के बाद जोड़कर कर सकते हैं ।

इसे ऐसा दिखना चाहिए:

#!/bin/bash
(
...
) 2>&1 | tee ...

जब यह मेसेज को सही क्रम में प्रदर्शित नहीं करता है, तो एक और उपधारा जोड़ने का प्रयास करें:

#!/bin/bash
((
...
) 2>&1) | tee ...

1
यह बहुत अच्छा काम करता है। वास्तव में आप स्टडआउट और स्टडर दोनों के साथ निर्देशित कर सकते हैं:( ... ) |& tee output.log
नोआम मानोस

13

जैसा कि मैंने आपके प्रश्न को पढ़ा है, आप आउटपुट को लॉग इन नहीं करना चाहते हैं, लेकिन कमांड का पूरा क्रम, जिस स्थिति में, अन्य उत्तर आपकी मदद नहीं करेंगे।

सब कुछ आउटपुट करने के लिए -x के साथ शेल लिपियों को शामिल करें:

sh -x foo.sh

उस फ़ाइल में लॉग इन करें जिसे आप चाहते हैं:

sh -x foo.sh >> /home/scripts/cron/logs


2
+1 -x विकल्प के लिए
कोक

10

बैश में, आप डाल सकते हैं set -xऔर यह प्रत्येक कमांड को प्रिंट करेगा जिसे वह निष्पादित करता है (और बैश चर) उसके बाद। आप इसे बंद कर सकते हैं set +x

यदि आप पागल होना चाहते हैं, तो आप set -o errexitअपनी स्क्रिप्ट में डाल सकते हैं । इसका मतलब है कि स्क्रिप्ट विफल हो जाएगी और बंद हो जाएगी यदि एक कमांड ने एक गैर-शून्य निकास कोड लौटा दिया, जो कि कुछ गलत हो गया था, यह संकेत देने के लिए यूनिक्स मानक तरीका है।

यदि आप अच्छे लॉग प्राप्त करना चाहते हैं, तो आपको डेबियन / ubuntu पैकेज tsमें देखना चाहिए moreutils। यह टाइमस्टैम्प के साथ प्रत्येक पंक्ति को उपसर्ग करेगा और इसे प्रिंट करेगा। इसलिए आप देख सकते हैं कि चीजें कब हो रही थीं।


1
"सेट -ओ errexit" "सेट -e" के रूप में एक ही बात होना चाहिए
अजित एंटनी

0

दूसरों ने जो कहा, उसके बाद सेट मैनुअल एक अच्छा संसाधन है। मैंने डाला:

#!/usr/bin/env bash
exec 1> command.log 2>&1
set -x

लिपियों के शीर्ष पर मैं जा रहा रखने के लिए, या set -exअगर यह त्रुटि पर बाहर निकलना चाहिए।


यह ssh लॉग और कमांड के सफल निष्पादन के लिए कैसे मदद करेगा?
अस्सिटगी जू

ओपी की डमी स्क्रिप्ट के साथ परीक्षण, यह प्रत्येक कमांड को रिकॉर्ड करता है और परिणाम जो भी हो: ssh टाइमआउट, गलत डोमेन, आदि या एक वैध ssh पते के लिए, यह दूरस्थ शेल में कमांड रिकॉर्ड करता है। यदि ssh लॉगिन के बारे में अधिक जानकारी की आवश्यकता है, शायद ssh -vv?
ड्रैगन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.