प्रिंट और प्रक्रियाओं के नाम जैसे ही वे बनाए जाते हैं


10

यहां सवाल से , ओपी pidofएक शेल स्क्रिप्ट में एक प्रक्रिया के पिड को बार-बार प्रदूषित करना चाहता है । बेशक यह अक्षम्य है क्योंकि pidofकार्यक्रम के लिए प्रति सेकंड कई बार एक नई प्रक्रिया शुरू की जानी चाहिए (मुझे नहीं पता कि यह प्रश्न में सीपीयू स्पाइक्स का कारण है, लेकिन ऐसा लगता है)।

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

इसलिए उपर्युक्त प्रश्न के लिए, एक समाधान के लिए कुछ कार्यक्रम हो सकते हैं जो प्रक्रियाओं के नाम और ग्रिड को आउटपुट करते हैं क्योंकि वे बनाए जाते हैं। तब आप कुछ ऐसा कर सकते थे:

pids-names |
  grep some_program |
  cut -f 2 |
  while read pid; do
    process-pid "$pid"
  done

इसके साथ समस्या यह है कि यह एक अधिक मौलिक प्रश्न उठाता है कि कैसे बनाए जा सकते हैं और प्रक्रिया के नाम कैसे मुद्रित किए जा सकते हैं?

मैंने एक प्रोग्राम बुलाया है ps-watcher, हालांकि इसके साथ समस्या यह है कि यह सिर्फ एक perlस्क्रिप्ट है जो बार-बार चलती है psइसलिए यह वास्तव में समस्या को हल नहीं करता है। एक अन्य विकल्प का उपयोग करना है auditdजो लॉग के माध्यम से सीधे संसाधित होने पर संभवतः काम कर सकता है tail -f। एक आदर्श समाधान इससे सरल और अधिक पोर्टेबल होगा, हालांकि मैं एक auditdसमाधान स्वीकार करूंगा यदि यह सबसे अच्छा विकल्प है।


1
एक दिलचस्प पक्ष यह है कि पीआईडी ​​को पहली बार निर्माण प्रक्रिया ( या संस्करण) की एक प्रति के रूप में बनाया जाता है fork, फिर execपरिवार के एक सदस्य का उपयोग करके नया कार्यक्रम शुरू किया जाता है। तो आप शायद लॉग इन करना चाहते हैं exec*, नहीं fork
derobert

2
एकमात्र पोर्टेबल कुशल तरीका जिसके बारे में मुझे पता है कि साधारण यूनिक्स प्रक्रिया लेखांकन का उपयोग करना है, जो एक प्रक्रिया से बाहर निकलने के बाद एक रिकॉर्ड लिखेगा । यदि आप प्रक्रियाएँ पकड़ना चाहते हैं जैसा कि वे बनाए गए हैं या निष्पादित किए गए हैं, तो आपको शायद सिस्टम-विशिष्ट चीजों की आवश्यकता होगी जैसे कि लिनक्स ऑडिट, सिस्टमटैप, या डीट्रेस।
मार्क प्लॉटनिक

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

1
@syntaxerror DBus इस मामले में सिस्टम के अंदरूनी कामकाज से बहुत दूर है - यह वास्तव में दो स्तरों से ऊपर है जो यहां चर्चा की जा रही है।
पीटर्फ

ठीक है, OSI लिंगो में यहाँ चर्चा की गई टीयर अभी भी dbus की तुलना में कम हो सकती है। मैं मानता हूं कि मैंने इस बारे में गहराई से नहीं सोचा था कि दोनों एक ही स्तर पर हैं या नहीं।
वाक्य रचना

जवाबों:


6

लिनक्स-विशिष्ट उत्तर:

perf-tools में एक निष्पादक होता है जो ठीक यही करता है। यह विभिन्न लिनक्स-विशिष्ट सुविधाओं जैसे कि ftrace का उपयोग करता है। डेबियन पर, परफेक्ट-टूल्स-अस्थिर पैकेज में।

मेरा उदाहरण man catदूसरे टर्मिनल में चल रहा है:

root@Zia:~# execsnoop 
TIME        PID   PPID ARGS
17:24:26  14189  12878 man cat 
17:24:26  14196  14189 tbl 
17:24:26  14195  14189 preconv -e UTF-8 
17:24:26  14199  14189 /bin/sh /usr/bin/nroff -mandoc -Tutf8 
17:24:26  14200  14189 less 
17:24:26  14201  14199 locale charmap 
17:24:26  14202  14199 groff -mtty-char -Tutf8 -mandoc 
17:24:26  14203  14202 troff -mtty-char -mandoc -Tutf8 
17:24:26  14204  14202 grotty 

मुझे संदेह है कि ऐसा करने का एक पोर्टेबल तरीका है।


2

ऐसा करने का सही तरीका TM इस बात पर निर्भर करता है कि आप वास्तव में किस सिस्टम और कर्नेल पर चल रहे हैं। DTrace को Solaris, Free / NetBSD और Linux पर काम करना चाहिए।

लिनक्स के लिए विशेष रूप से, आप या तो ftrace का उपयोग कर सकते हैं (जिसे संकलन के समय सक्षम करना होता है - यह आमतौर पर होता है) या नेटलिंक पर घटनाओं की खरीद करें - अधिक विवरण के लिए समस्या का SO उत्तर देखें (और इसे वोट करने के लिए याद रखें, स्कोर ~ स्वीकार किए जाते हैं जवाब के लिए 30 बनाम 0 अजीब लग रहा है)। गरीब आदमी की अनुरेखक संभवतः strace -eexec,fork(हालांकि अनुचित ओवरहेड के साथ) का उपयोग करके लागू किया जा सकता है ।

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