पृष्ठभूमि या बूट स्क्रिप्ट का आउटपुट लॉग करें


10

मेरे पास एक छोटी स्क्रिप्ट है जिसे विशेष घटनाओं के लिए सिस्टम डेमॉन द्वारा निष्पादित किया जाता है। मुझे पता है कि घटना घट रही है और स्क्रिप्ट निष्पादित हो रही है, लेकिन यह वह नहीं करता है जो मैं चाहता हूं। अजीब बात है, यह तब होता है जब मैं इसे मैन्युअल रूप से चलाता हूं, इसलिए मैं बहुत भ्रमित हूं।

मैं कैसे पता लगा सकता हूं कि क्या चल रहा है? स्क्रिप्ट मूल रूप से इस तरह की कमांड की एक श्रृंखला है:

/bin/foo on 3
sudo bar a

मुझे लगता है कि यह डिबगिंग सिस्टम स्क्रिप्ट पर एक ट्यूटोरियल होने का इरादा है, लेकिन थोड़ा सा भी है U&L। मैं शीर्षक को गलत बताता हूं और "डिबगिंग के लिए एक सिस्टम स्क्रिप्ट के आउटपुट को लॉग इन करने" का सुझाव दूंगा, इससे उद्देश्य स्पष्ट हो जाएगा। जब मैं इन foo barउदाहरणों को पढ़ता हूं, तो मेरा दिमाग भी जम जाता है , मैं ऐसी चीज पसंद करता हूं, जो वास्तविक दुनिया की तरह दिखती है। मैं किसी भी पोस्ट को संपादित करने के लिए अनिच्छुक हूं, इसलिए आप इसे छोड़ देंगे अगर आपको लगता है कि इसमें सुधार किया जा सकता है।
मिलिअवेज़

1
@Milliways तुम सही हो, "सिस्टम स्क्रिप्ट" वैसे भी एक मिथ्या नाम था इसलिए मैंने शीर्षक बदल दिया है। मैं फ़ोबोबार चीज़ के बारे में असहमत हूं - लोगों को आम लिंगो / बोलचाल की भाषा को पहचानना सीखना होगा, जैसा कि वे किसी भी संस्कृति में हो सकते हैं। एक बार जब आप दोनों को एक साथ रख देते हैं, तब भी यह अच्छा होता है।
गोल्डीलॉक्स

जवाबों:


8

सबसे पहले, यदि स्क्रिप्ट को सिस्टम डेमॉन द्वारा चलाया जाता है और यह डेम रूट विशेषाधिकारों के साथ चल रहा है, तो आपको उपयोग करने की आवश्यकता नहीं है sudo। इसमें init(और systemd) शामिल हैं, जिसमें शामिल हैं rc.local। यदि वह डेमॉन रूट विशेषाधिकारों के साथ नहीं चल रहा है, तब sudoतक काम नहीं करेगा जब तक /etc/sudoersकि इस तरह के (और पासवर्ड के बिना) को अनुमति देने के लिए कॉन्फ़िगर नहीं किया जाता है। रास्पियन उपयोगकर्ता इससे भ्रमित हो सकते हैं क्योंकि piउपयोगकर्ता को डिफ़ॉल्ट रूप से कुछ भी करने की अनुमति है (और यदि आप देखते हैं तो आप /etc/sudoersदेखेंगे कि यह कैसे पूरा होता है)।

इसके बाद, आप किसी भी bashस्क्रिप्ट से या किसी भी स्क्रिप्ट के अंदर कमांड के सेट से आउटपुट कैप्चर कर सकते हैं , उन्हें एक सब-सब्मिट में निष्पादित करके: 1

(
    /bin/foo on 3
    sudo bar a
) &> /var/log/myTestLog.txt

()इंगित करता है एक subshell । इसके अंदर किसी भी चीज से सभी आउटपुट को एक /var/log/myTestLog.txtफाइल में रीडायरेक्ट किया जा रहा है । कुछ नोट:

  • &>एक है bashism , इसलिए यदि स्क्रिप्ट एक के माध्यम से क्रियान्वित किया जाता है मामला पहली पंक्ति पर, यह होना चाहिए #!/bin/bash, न कि केवल /bin/sh"बशीज़" केवल bashशेल में काम करते हैं ।

    इसमें वह शामिल है /etc/rc.local, जो डिफ़ॉल्ट रूप से उपयोग होता है /bin/sh(यानी, हां, आप इसे सुरक्षित रूप से बदल सकते हैं /bin/bash)।

  • /var/logलिखने के लिए रूट विशेषाधिकारों की आवश्यकता होती है। यदि प्रक्रिया में ऐसा नहीं है, तो एक निर्देशिका का उपयोग करें या बनाएं जिसे आप जानते हैं कि यह कर सकता है। जब संदेह में, यदि आप सिस्टम को बंद या रिबूट किए बिना इसका परीक्षण कर सकते हैं, तो उपयोग करें /tmp, जो कि विश्व लेखन योग्य है (अर्थात, किसी के द्वारा)। हालाँकि, /tmpबूट्स के पार नहीं रहता है। यह एक छोटा, रैम आधारित विभाजन भी है, इसलिए इसके लिए डेटा के gigs नहीं लिखें। यह आपका एसडी कार्ड नहीं है [वास्तव में रास्पबियन के वर्तमान संस्करणों पर, लेकिन व्यवहार में इस पर भरोसा नहीं है]

  • &>में कुछ भी अधिलेखित कर देगा myTestLog.txt। यदि इसके बजाय आप एक मौजूदा लॉग में जोड़ना चाहते हैं, जो डीबगिंग उद्देश्यों के लिए एक अच्छा विचार हो सकता है, तो उपयोग करें &>>। फिर आप इस तरह इस उपखंड की शुरुआत में एक कमांड जोड़ सकते हैं:

    echo Starting $(date)

    प्रत्येक रन से जानकारी को अलग करने के लिए। यदि आप सुनिश्चित नहीं हैं कि यह क्या करता है, तो कमांड लाइन पर प्रयास करें।

यह अंतिम बिंदु कुछ ऐसी चीज़ों का एक अच्छा चित्रण है जो आप उन कमांडों के संबंध में कर सकते हैं जो कुछ भी आउटपुट नहीं करते हैं - लेकिन उनमें से अधिकांश -v"वर्बोज़" के लिए , उदाहरण के लिए , यदि आप शामिल हैं, तो करते हैं । कुछ कमांड के लिए खबरदार का -vअर्थ "प्रिंट संस्करण की जानकारी" है। यह सुनिश्चित करने के लिए कि यह कैसे काम करेगा और कैसे काम करता है (कुछ कमांड भी अलग स्विच का उपयोग करता है ) के लिए मैन पेज में एक नज़र डालें -v

कन्वेंशन द्वारा, कमांड भी पूर्ण होने पर 0 का मान लौटाते हैं। इसे कभी-कभी "निकास स्थिति" कहा जाता है और आप इसे सामान्य रूप से नहीं देखते हैं, लेकिन शेल आपको दिखाएगा echo $?। प्रयत्न

 ls /
 echo $?
 ls /nonexistantdir
 echo $?

आपको 0 और 2. मिलेंगे। यदि आप ls"एक्जिट स्टेटस" के तहत मैन पेज देखते हैं, तो आप बल्कि अनिर्णायक, क्रिप्टिक देखेंगे:

2      if serious trouble (e.g., cannot access command-line argument).

जो कुछ भी नहीं से बेहतर हो सकता है या नहीं, लेकिन आप वहां जाते हैं।

बहुत कम से कम, यह इंगित करता है कि कमांड किसी कारण से विफल हो गया है। बाहर निकलने की स्थिति भी आपको इस तरह की चीजें करने की अनुमति देती है:

/bin/foo && sudo bar

&&इस मामले में अर्थ है "यदि पहले आदेश सफल होता है", पहले आदेश मानते हुए 0 लौटने का सम्मेलन का उपयोग करता है (जिसके कारण वे आम तौर पर करते हैं)। अगर /bin/fooकाम नहीं करता है, नहीं मिल सकता है, आदि, तो sudo barकभी नहीं होगा।

लॉगिंग संदेशों और सशर्त निष्पादन ( &&) के संयोजन का उपयोग करके आपको समस्या का पता लगाने के लिए बहुत करीब आना चाहिए, या कम से कम जानकारी प्राप्त करना चाहिए जो समस्या को हल करने में आपकी सहायता के लिए दूसरों के लिए उपयोगी हो सकती है। इसके बिना, सबसे अधिक किसी और को अक्सर अनुमान लगाया जा सकता है।


1. आप उपयोग करके अंदर से पूरी स्क्रिप्ट के लिए एक ही आउटपुट रिडायरेक्शन को पूरा कर सकते हैं:

exec &> /var/log/myTestLog.txt

शीर्ष पर (या कहीं भी, और यह बाद में सब कुछ पर लागू होगा)।


2

एक महत्वपूर्ण पहलू लोगों को भूल जाते हैं जब स्क्रिप्ट चलाने के रूप में डेमॉन शेल पर्यावरण, और $PATHविशेष रूप से चर है। आपके उदाहरण में, दूसरी पंक्ति इस पर निर्भर करती है $PATH: का पूरा नाम sudoहै /usr/bin/sudo, और आपका उपयोगकर्ता शेल केवल यह जानता है कि क्योंकि इसे /usr/binनिष्पादन योग्यताओं की तलाश में खोज करने के लिए कहा गया था । उसी के लिए सच है bar

sudoजब स्क्रिप्ट को डेमन के रूप में चलाने की आवश्यकता नहीं है, तो यह देखते हुए कि आपकी दूसरी पंक्ति इस तरह दिखनी चाहिए:

/path/to/bar a
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.