पहले से चल रही स्क्रिप्ट से पुनर्निर्देशित स्टाडर


14

मैं अब कई दिनों से एक स्क्रिप्ट चला रहा हूं। मैंने स्टडआउट को रीडायरेक्ट किया $HOME/mylog, लेकिन स्ट्रीडर को पुनर्निर्देशित नहीं किया क्योंकि मुझे लगा कि इस पर कुछ नहीं होगा। अचानक से हज़ारों लाइनें लाइनर पर निकलने लगीं, इसलिए मैंने नौकरी को स्थगित कर दिया। क्या कोई तरीका है जिससे मैं $HOME/myerrस्क्रिप्ट को पुनः आरंभ करने की आवश्यकता के बिना, अब से स्टैडर को पुनर्निर्देशित कर सकता हूं ?

मेरे पास बॉक्स पर सुडो एक्सेस है और यह ओएस एक्स है।

शायद dtools फँसाने का उपयोग कर कुछ?

मैं उस काम को नहीं खो सकता जो स्क्रिप्ट ने अब तक किया है और इसे खरोंच से पुनः आरंभ करता है। क्या डिस्क पर "इन-मेमोरी ऑब्जेक्ट्स को डंप करने" का एक तरीका है, प्रोग्राम को फ्रीज करें, चर (जैसे फ़ाइल डिस्क्रिप्टर) को संपादित करें और नए संदर्भ के साथ फिर से शुरू करें?


जवाबों:


12

मुझे लगता है कि यह संभव है यदि आप संबंधित दुभाषिया की प्रक्रिया को जीडीबी से जोड़ते हैं। मैंने इसे इस पर्ल वन-लाइनर के साथ आज़माया

 perl -e 'do { print "x\n"; sleep(1) } while(1)'

और यह काम करता है लेकिन दुर्भाग्य से एक समान बैश स्क्रिप्ट के साथ नहीं है।


सबसे पहले आपको उस प्रक्रिया के PID का पता लगाना होगा जिसका आउटपुट आप कैप्चर करना चाहते हैं। फिर gdbदूसरे टर्मिनल में शुरू करें और निम्नलिखित gdb- कमांड्स को निष्पादित करें

attach PID
call close(2)
call open("/abs/olu/te/path/filename", 65, 384)
detach PID

उसके बाद जो पूरा डेटा लिखा जाता stderrहै, उसे पुनर्निर्देशित किया जाता /abs/olu/te/path/filenameहै

  • attach PID प्रक्रिया को gdb में संलग्न करता है और उसे रोकता है
  • call close(2)stderrप्रक्रिया के पंजीकृतकर्ता को बंद कर देता है ( stdoutदर्जकर्ता के लिए 1 है)
  • call open(...) एक नई फ़ाइल खोलता है और नए बनाए गए फाइलस्क्रिप्ट के लिए सबसे कम अप्रयुक्त पूर्णांक लेता है और
  • detach PID प्रक्रिया जारी है

कम से कम मेरी मशीन पर। पहली दो पंक्तियाँ POSIX संगत हैं लेकिन तीसरी नहीं।

openतीसरी पंक्ति में दूसरे और तीसरे तर्क का दस्तावेजीकरण किया गया है man 2 open। मेरे मामले में 65 का मतलब है कि openफाइल बनाना चाहिए और फाइल को केवल राइट O_WRONLY | O_CREAT( यानी परिभाषित fcntl.h) खोलना चाहिए । तीसरा तर्क बताता है कि फ़ाइल को उपयोगकर्ता के लिए पढ़ने और लिखने की अनुमति है S_IWUSR | S_IRUSR( यानी परिभाषित sys/stat.h)। तो हो सकता है कि आपको अपने मशीन पर उचित मूल्यों का पता लगाना होगा।


इसने इतनी बेवकूफी से अच्छा काम किया ... हैट्स ऑफ !!
Robottinosino

8

यह एक कच्चा जवाब है और मुझे आशा है कि कोई और बेहतर करता है, लेकिन यदि कोई अन्य विचार सतह नहीं है, तो gdb संलग्न करें और प्रक्रिया को कुछ syscalls करने के लिए मजबूर करें:

(gdb) attach 12345 # target PID
(gdb) p close(2)
(gdb) p open("errfile", O_WRONLY)
(gdb) c

निफ्टी। मुझे पता नहीं था कि gdb ऐसा कर सकता है। क्या किसी विशिष्ट फ़ाइल डिस्क्रिप्टर संख्या के लिए बाध्य करने का कोई तरीका है? जैसे कि अगर एफडी 1 अप्रयुक्त है, और open()एफडी 1 को पकड़ लेता है? या आपको बस dup()कुछ बार कॉल करना है?
पैट्रिक

क्या p open("errfile", O_WRONLY)वास्तव में आपके मशीन पर काम करता है ?
user1146332

आप एक स्टिक में जा सकते हैं p dup2(xxx, 2)और फिर रिटर्न का मूल्य p close(xxx)कहां xxxहै open। यह मुश्किल सामान है, लंबे समय से चल रही प्रक्रिया पर इन आदेशों का उपयोग न करें, जब तक आप सुनिश्चित न हों कि कोई अन्य विकल्प नहीं है।
एलन करी

@ user1146332 यह किया है जब मैं इसे करने की कोशिश है क्योंकि मैं प्रयोग किया जाता /dev/nullके रूप में मेरी errfileतो मैं जरूरत नहीं थी O_CREAT। और O_WRONLYएक मैक्रो होने के नाते, यह फैलता है या नहीं, इस पर निर्भर करता है कि क्या जीडीबी ने एक पंक्ति में प्रक्रिया को रोक दिया है जहां डिबगिंग प्रतीक उपलब्ध हैं और मैक्रो को परिभाषित किया गया है। जीडीबी के साथ एक प्रक्रिया में कोड इंजेक्ट करना खतरनाक है और किसी को भी बिना समझे इन आदेशों की नकल नहीं करनी चाहिए।
एलन करी

@AlanCurry मुझे नहीं लगता कि अगर सामान्य डिबगिंग की जानकारी उपलब्ध है तो gdb मैक्रोज़ का विस्तार करता है। आपको विशेष झंडे के साथ स्रोतों को संकलित करना होगा ( यहां देखें )। इसके अलावा यह बहुत ही असामान्य है कि आपके सिस्टम पर एक मनमाने ढंग से निष्पादन योग्य डिबगिंग जानकारी शामिल है (सूचना को मैक्रो के साथ बढ़ाया जाता है)। लेकिन मैं आपसे सहमत हूं कि आमतौर पर कोड इंजेक्शन उचित नहीं है, लेकिन ऐसे मामले भी हो सकते हैं जहां आपको फायदा होता है।
user1146332
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.