कैसे पता करें कि क्या प्रक्रिया STDOUT को लिख रहा है?


19

मेरे पास एक प्रक्रिया के दो उदाहरण हैं। उनमें से एक है "frEAkIng oUT!" और मुद्रण त्रुटियों गैर रोक STDOUT के लिए।

मैं टूटी हुई प्रक्रिया को मारना चाहता हूं, लेकिन मुझे यह सुनिश्चित करना होगा कि मैं गलत को समाप्त न करूं। वे दोनों एक ही समय में शुरू किए गए थे और topमैं देख सकता हूं कि वे दोनों एक ही मात्रा में मेमोरी और सीपीयू के बारे में उपयोग कर सकते हैं। मुझे ऐसा कुछ भी नहीं मिल रहा है जो इस बात की ओर इशारा करता हो कि कौन सी प्रक्रिया बुरी तरह से व्यवहार कर रही है।

सबसे सुरक्षित बात यह पता लगाना होगा कि कौन सी प्रक्रिया / पीआईडी ​​STDOUT को लिख रही है।

क्या उसे करने का कोई तरीका है?


1
स्टडआउट के लिए लिखने का मतलब होगा इसकी फाइल डिस्क्रिप्टर 1 (प्रश्न में प्रक्रिया का) जो टर्मिनल या कुछ भी हो सकता है /dev/null। क्या आप वाकई एक विशेष फ़ाइल (टर्मिनल डिवाइस या लॉग फ़ाइल की तरह) के बजाय इसका मतलब नहीं है ?
स्टीफन चेजलस

यदि वे दोनों एक ही शेल में शुरू किए गए थे, तो वे दोनों STDOUT पर लिख रहे हैं, इसलिए इसे पिन करने से आपको 2 में से किसकी पहचान करने में मदद नहीं मिलेगी। जोफेल की विधि संभावना है कि आप क्या देख रहे हैं।
स्लम

वह वास्तव में क्या मतलब है जो टर्मिनल पर आउटपुट का उत्पादन कर रहा है
बारमर

जवाबों:


17

लिनक्स पर, यह मानते हुए कि आप जानना चाहते हैं कि आपके शेल के स्टडआउट से जुड़े संसाधन क्या लिख ​​रहे हैं, आप कर सकते हैं:

strace -fe write $(lsof -t "/proc/$$/fd/1" | sed 's/^/-p/')

यह write()हर प्रक्रिया के सिस्टम कॉल (किसी भी फाइल डिस्क्रिप्टर पर) को रिपोर्ट करेगा जिसमें आपके शेल के fd 1 के समान फ़ाइल पर कम से कम एक फ़ाइल डिस्क्रिप्टर खुला हो।


शुरू में मेरे मन में यही था, मैं दोनों तरीकों की कोशिश करूंगा कि आप दोनों का धन्यवाद।
TCZ8

23

आप उन्हें SIGSTOP (वास्तविक द्वारा pid1 और pid2 की जगह भेजकर दोनों प्रसंस्करण रोक सकता PIDs या उपयोग killallऔर आवेदन नाम):

kill -SIGSTOP pid1 pid2

टर्मिनल पर मुद्रण (या जहां भी स्टडआउट को पुनर्निर्देशित किया गया है) को रोकना चाहिए। फिर उनमें से एक का उपयोग जारी रखें

kill -SIGCONT pid1

यदि त्रुटि संदेश तुरंत दिखाई देते हैं, तो आप इसकी पहली प्रक्रिया जानते हैं। यदि नहीं तो आप इसे फिर से रोक सकते हैं और दूसरा जारी रख सकते हैं ...

एक रुकी हुई प्रक्रिया को मारने से पहले, पहले SIGCONT भेजना अच्छा अभ्यास है।

उसी तकनीक के साथ इस्तेमाल किया जा सकता Ctrl-Zऔर खोल नौकरी नियंत्रण ( fg %1, bg %1, kill %1, ...)।


1
यह समस्या निवारण का एक बहुत अच्छा तरीका है, लेकिन मैं वास्तव में ट्रेस करने का एक तरीका ढूंढ रहा हूं जो टर्मिनल के लिए उपयुक्त है। धन्यवाद
TCZ8

क्या इस सवाल को फिर से सुना जा रहा था, ऐसा लगता है जैसे मैंने अपनी आखिरी टिप्पणी लिखते समय मस्तिष्क का मस्सा किया था। इससे मेरी समस्या भी ठीक हो जाएगी। धन्यवाद।
TCZ8
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.