डेमॉन की धारणा फाइलों से नहीं, प्रक्रियाओं से जुड़ी है । इस कारण से, "फाइल सिस्टम पर डेमन को खोजने" में कोई समझदारी नहीं है। बस धारणा को थोड़ा स्पष्ट करने के लिए: एक प्रोग्राम एक निष्पादन योग्य फ़ाइल (आउटपुट में दिखाई देता है ); एक प्रक्रिया उस प्रोग्राम का एक उदाहरण है (आउटपुट में दिखाई देता है )।ls
ps
अब, यदि हम अपने उत्तर में दी गई जानकारी का उपयोग करते हैं, तो हम उन प्रक्रियाओं की खोज करके रनिंग डेमों को खोज सकते हैं, जो उनके साथ जुड़े एक नियंत्रित टर्मिनल के बिना चलती हैं । यह काफी आसानी से किया जा सकता है ps
:
$ ps -eo 'tty,pid,comm' | grep ^?
tty
उत्पादन क्षेत्र में शामिल है "?" जब प्रक्रिया का कोई नियंत्रण टर्मिनल नहीं है।
यहां बड़ी समस्या तब आती है जब आपका सिस्टम एक ग्राफिकल वातावरण चलाता है। चूंकि जीयूआई कार्यक्रम (यानी क्रोमियम) एक टर्मिनल से जुड़े नहीं हैं, वे आउटपुट में भी दिखाई देते हैं। एक मानक प्रणाली पर, जहां रूट ग्राफ़िकल प्रोग्राम नहीं चलाता है, आप बस पिछली सूची को रूट की प्रक्रियाओं तक सीमित कर सकते हैं। यह ps
' -U
स्विच ' का उपयोग करके प्राप्त किया जा सकता है ।
$ ps -U0 -o 'tty,pid,comm' | grep ^?
फिर भी, दो समस्याएं यहां उत्पन्न होती हैं:
- यदि रूट चित्रमय कार्यक्रम चला रहा है, तो वे दिखाएंगे।
- रूट विशेषाधिकारों के बिना चलने वाले डेमॉन नहीं करेंगे। ध्यान दें कि बूट समय पर शुरू होने वाले डेमन आमतौर पर रूट के रूप में चल रहे हैं।
मूल रूप से, हम सभी कार्यक्रमों को एक नियंत्रित टर्मिनल के बिना प्रदर्शित करना चाहते हैं , लेकिन जीयूआई कार्यक्रम नहीं । सौभाग्य से हमारे लिए, GUI प्रक्रियाओं को सूचीबद्ध करने के लिए एक कार्यक्रम है xlsclients
:! एसएलएम का यह उत्तर बताता है कि सभी जीयूआई कार्यक्रमों को सूचीबद्ध करने के लिए इसका उपयोग कैसे करें, लेकिन हमें इसे उल्टा करना होगा, क्योंकि हम उन्हें बाहर करना चाहते हैं। यह --deselect
स्विच का उपयोग करके किया जा सकता है ।
सबसे पहले, हम उन सभी GUI कार्यक्रमों की एक सूची बनाएंगे, जिनके लिए हमारे पास प्रक्रियाएँ चल रही हैं। मैंने जो उत्तर दिया है, उससे जुड़ा हुआ, यह प्रयोग करके किया गया है ...
$ xlsclients | cut -d' ' -f3 | paste - -s -d ','
अब, ps
एक -C
स्विच है जो हमें कमांड नाम से चयन करने की अनुमति देता है। हमें बस हमारी कमांड सूची मिली है, इसलिए इसे ps
कमांड लाइन में इंजेक्ट करें । ध्यान दें कि मैं --deselect
बाद में अपने चयन को उलटने के लिए उपयोग कर रहा हूं ।
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect
अब, हमारे पास सभी गैर-जीयूआई प्रक्रियाओं की एक सूची है। चलो हमारे "कोई TTY संलग्न" नियम को न भूलें। इसके लिए, मैं प्रत्येक प्रक्रिया (और इसकी पूर्ण कमांड लाइन) के -o tty,args
आउटपुट के लिए पिछली पंक्ति में जोड़ दूँगा tty
:
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect -o tty,args | grep ^?
अंतिम grep
सभी पंक्तियों को कैप्चर करता है जो "?" से शुरू होती हैं, अर्थात, सभी प्रक्रियाएं एक नियंत्रित ट्टी के बिना। और वहाँ तुम जाओ! यह अंतिम पंक्ति आपको एक नियंत्रित टर्मिनल के बिना चलने वाली सभी गैर-जीयूआई प्रक्रिया देती है। ध्यान दें कि आप अभी भी इसे सुधार सकते हैं, उदाहरण के लिए, कर्नेल थ्रेड्स (जो प्रक्रियाएं नहीं हैं) को छोड़कर ...
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,args | grep ^?
... या आपके द्वारा पढ़ने के लिए जानकारी के कुछ कॉलम जोड़कर:
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,uid,pid,ppid,args | grep ^?
network-manager
, नहींNetworkManager
।