डिबगिंग: कंसोल आउटपुट और अपस्टार्ट स्क्रिप्ट्स


16

आप अजगर कोड में ट्रेसबैक खोजने के लिए टर्मिनल पर एक अपस्टार्ट स्क्रिप्ट का आउटपुट कैसे भेजते हैं? यह मुझे हमेशा ट्रेस-बैक के बिना चीजों को करने के लिए ले जा रहा है जो सिर्फ एक सेकंड लेते थे। मुझे त्रुटियों को ट्रैक करने के लिए कई फ़ाइल लिखने के कॉल करने होंगे। ट्रेसबैक के साथ खोजने के लिए पहले जो दूसरा लिया गया वह कई मिनटों में बदल रहा है। यह दयनीय है। यह कुछ हफ्तों से चल रहा है और मैं इससे बीमार हूं। कृपया इस पर कुछ बोलेंगे। मुझे लगता है कि मैं एक डिबगर के बिना फिर से विधानसभा का उपयोग कर रहा हूं।

जवाबों:


27

यदि आप Upstart 1.4 या नए का उपयोग console logकरते हैं, तो अपने Upstart नौकरी में रखें और stdout / stderr को सभी आउटपुट समाप्त हो जाएंगे /var/log/upstart/<job>.log। तब आप tail -f /var/log/upstart/<job>.log &टर्मिनल में आउटपुट प्रकट होने के लिए कर सकते हैं ।


पार्टी के लिए देर से, लेकिन इस जवाब ने मुझे बचा लिया :) इसके अलावा यह मेरे लिए काम करता है बिना किसी विशेष सेटिंग के upstart conf फ़ाइल में। मेरे हिस्से के लिए यह स्वीकृत उत्तर होना चाहिए।
rslite

पता नहीं था कि अपस्टार्ट प्रबंधित सेवा लॉग इन हैं /var/log/upstart। वास्तव में उपयोगी, धन्यवाद।
फ्रांसिस्को

2

अपस्टार्ट कुकबुक में डिबगिंग तकनीकों पर एक पूरा खंड है । सबसे आसान काम जो आप कर सकते हैं, वह --debugहै आपके कर्नेल तर्कों में जोड़ना , जो अपस्टार्ट की क्रियाशीलता को बढ़ाएगा और सब कुछ सिसलॉग को डंप कर देगा। हां, डिबगिंग जटिल है, यह एक समानांतर init सिस्टम बनाने के लिए आवश्यक शुद्ध जटिलता का प्रतिबिंब है। मुझे यकीन है कि सुधार की गुंजाइश है।


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

अच्छा, फिर आप क्या सुझाव देंगे? यह एक खुला दस्तावेज है। यदि आपको एक डिबगिंग तकनीक मिली है, जो कि वहां प्रस्तुत की गई छलांग और सीमा है, तो कृपया इसे जोड़ें। ओपी की समस्याएं यह समझने का एक परिणाम है कि अपनी पसंद के अतिरिक्त रनटाइम के अंदर बेसिक यूनिक्स प्रतिमानों को कैसे प्रबंधित किया जाए, यह उस संदर्भ के अनुसार है जिसे आप यहां तैनात कर रहे हैं। सिर्फ इसलिए कि आप अजगर का उपयोग कर रहे हैं या [यहां फैंसी रनटाइम भाषा डालें] का मतलब यह नहीं है। मौलिक क्रम को अनदेखा करने के लिए, UNIX
२०:०२ पर पेप्त्रकी

2

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

यह निश्चित रूप से डेमन को चालू रखने में मदद करता है।

कुछ नमूना कोड (मैं दिलचस्प हिस्सों को नहीं हटाता):

import logging

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s %(levelname)s %(message)s',
                    filename=LOG_FILE,
                    filemode='w')
    logging.info("Sincrod inicializado")
    if not DEBUG:
        daemonize()
    while True:
        try:
            actua()
        except:
            logging.error(sys.exc_info())
        if (datetime.datetime.now().hour > NOITE_EMPEZA\
         and datetime.datetime.now().hour < NOITE_REMATA):
            time.sleep(INTERVALO_NOITE)
        else:
            time.sleep(INTERVALO_DIA)

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

डेमॉन

Daemons विंडोज़ सेवाओं के बराबर यूनिक्स हैं। वे ऐसी प्रक्रियाएं हैं जो अन्य प्रक्रियाओं से स्वतंत्र पृष्ठभूमि में चलती हैं। इसका मतलब है कि उनके पिता आमतौर पर अयोग्य हैं, और वे किसी भी प्रकार से अलग हो जाते हैं। जैसा कि वे स्वतंत्र हैं, उनके उत्पादन को लगाने के लिए कोई पूर्वनिर्धारित जगह नहीं है।

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

def daemonize():
    """Forks this process creating a daemon and killing the original one"""
    if (not os.fork()):
        # get our own session and fixup std[in,out,err]
        os.setsid()
        sys.stdin.close()
        sys.stdout = NullDevice()
        sys.stderr = NullDevice()
        if (not os.fork()):
            # hang around till adopted by init
            ppid = os.getppid()
            while (ppid != 1):
                time.sleep(0.5)
                ppid = os.getppid()
        else:
            # time for child to die
            os._exit(0)
    else:
        # wait for child to die and then bail
        os.wait()
        sys.exit()

अछा ठीक है। चूँकि आप पहले से ही syslog में प्रवेश कर रहे हैं, तो बस अपने डेमन संदेशों को फ़िल्टर करें और उन्हें कंसोल पर डंप करें। मैं यह नहीं देखता कि यह ऊपर की ओर क्यों विशिष्ट है? SysV init में भी यही समस्या होगी।
पेप्त्रकी

आप सही कह रहे हैं, यह किसी विशेष के लिए नहीं है, सच कहूं तो मेरे अधिकांश सर्वर 8.04 पर चलते हैं, कोई अपस्टार्ट नहीं। लेकिन यह अपस्टार्ट के लिए भी मान्य है। ओपी पूछ रहा था कि अपस्टार्ट के साथ अजगर लिपियों को कैसे डिबग किया जाए, न कि उस तरीके के लिए जो केवल अपस्टार्ट के साथ काम करता है। मैं syslog में प्रवेश नहीं कर रहा हूँ, लेकिन एक विशिष्ट फ़ाइल में, और यहाँ 'ट्रिक' सभी अपवादों को पकड़ रही है और स्टैक ट्रेस को उस फ़ाइल में डंप कर रही है।
जेवियर रिवेरा

ठीक है, यह सिर्फ संदर्भ के आधार पर stdout का प्रबंधन कर रहा है? मैं बहुत से यूनिक्स डेमन्स को जानता हूं, जिनके पास समान लॉगिंग वर्बोसिटी है, चाहे वह डाइट के रूप में ट्टी या फंक्शन से जुड़ी हो। यदि यह रूबी थे, तो मैं बेस क्लास पद्धति को ओवर-राइड या सजाने के लिए उपयोग करूंगा जो अपवाद आउटपुट के लिए उपयोग करते हैं। मुझे यकीन है कि पायथन में कुछ ऐसा ही किया जा सकता है। आपको स्टैक एक्सचेंज पर इस प्रश्न को उचित तरीके से पूछना बेहतर हो सकता है। यह एक बुनियादी यूनिक्स डेमॉन कोडिंग / डिज़ाइन समस्या से अधिक है, और जैसा कि आपने कहा, यह इनिट स्क्रिप्ट के साथ करने के लिए कुछ भी विशिष्ट नहीं है।
1948 में

मैं अभी भी लिंगो से परिचित हूं। मैं डेमन द्वारा ग्रहण करता हूं, आपका मतलब एक विशिष्ट स्क्रिप्ट है जो पृष्ठभूमि में चलती है। आपके कोड में, मैंने बस अपनी स्क्रिप्ट को एक्टुआ () के स्थान पर रखा है ताकि उस स्क्रिप्ट कॉल के कॉलबैक प्राप्त कर सकें? वहाँ एक फ़ाइल के बजाय एक सांत्वना के लिए चैनल वैसे भी है?
बंबूतु

1
अकेले स्टैंड में डेमॉन आमतौर पर उस tty से अलग हो जाते हैं जिसे उन्होंने शुरू किया था, स्टड, स्टडआउट, और स्टडिन में अपनी मूल फ़ाइल हैंडल को बंद कर दिया है, और इनिट का एक बच्चा है। इसलिए यदि आप किसी विशेष स्थान पर अपवादों को प्रिंट करना चाहते हैं, तो पता करें कि वे कैसे आउटपुट हैं, और उन्हें वहां से निर्देशित करें। linfo.org/daemon.html । फिर, यह ऊपर के साथ, या यहाँ तक कि मामले के लिए init के साथ कुछ भी नहीं है। अपने प्रोग्राम को सही डेमॉन मोड में सही ढंग से कार्य करें और फिर इसे ऊपर की ओर ले जाएँ।
पेप्त्रकी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.