मैं किसी दिए गए बच्चे की प्रक्रिया की मूल प्रक्रिया आईडी कैसे प्राप्त करूं?


49

किसी दिए गए बच्चों के माता-पिता से कैसे प्राप्त करें?

मुझे पता है कि मैं mannully इसे / proc के तहत जांच सकता हूं, मुझे आश्चर्य है कि क्या उबंटू में इसे प्राप्त करने का एक स्मार्ट / बेहतर तरीका है। ध्यान दें कि माता-पिता मारे जा सकते हैं या नहीं।

धन्यवाद

जवाबों:


58

कमांड-लाइन का उपयोग करके एक बच्चे की प्रक्रिया आईडी (पीआईडी) से माता-पिता पीआईडी ​​(पीपीआईडी) कैसे प्राप्त करें

उपयोग ps -o ppid=

  • उदाहरण के लिए ps -o ppid= 2072रिटर्न 2061, जिसे आप आसानी से स्क्रिप्ट आदि में उपयोग कर सकते हैं, ps -o ppid= -C fooकमांड के साथ प्रक्रिया का पीपीआईडी ​​देता है foo। तुम भी पुराने जमाने का उपयोग कर सकते ps | grep: ps -eo ppid,comm | grep '[f]oo'
  • फुलर स्पष्टीकरण: ps -f 2072रिटर्न
    UID PID   PPID   C STIME TTY स्टेट टाइम CMD
    izx 2072   2061   0 07:16? S 0:00 / usr / lib / pulseaudio / नाड़ी / gconf- सहायक
    
  • pstreeसंबंध है: pstree -s -p 2072:
    init (1) ───pulseaudio (2061) ───gconf-हेल्पर (2072)
    

क्या आप लाइनों को विभाजित किए बिना pstree शो इनवोकेशन (कमांड + तर्क) बनाने का एक तरीका जानते हैं? यदि मैं तर्क को एक पंक्ति में आसानी से फिट कर सकता हूं, तो मेरी स्थापना स्वचालित रूप से लाइनों को विभाजित करती है, भले ही मैं तर्क जोड़ता हूं। मैन पेज उतना ही कहने के लिए प्रकट होता है, लेकिन एक कारण नहीं देता है। मेरे वर्कअराउंड में PID को Pstree से निकालने और ps -o args ...परिणामों पर उपयोग करना शामिल है, लेकिन इसमें थोड़ी गंध है।
जॉन पी

बस कुछ है जिसने मुझे आश्चर्यचकित किया: ppid= पिड के बाद लेकिन इससे पहले की जगह आवश्यक प्रतीत होती है। यदि मैंने इसे छोड़ दिया तो मुझे अलग परिणाम मिले।
ग्रेगरी एरेनीस

8

माता-पिता पीआईडी ​​पाने के लिए केवल चर का उपयोग करना :

echo $PPID

यदि आपको इस पैरेंट से कमांड की आवश्यकता है:

cat /proc/$PPID/comm

अगर आपको पूरी कमांड लाइन की जरूरत है (सभी विकल्पों के साथ):

cat /proc/$PPID/cmdline

व्याख्या

  • $PPID शेल द्वारा परिभाषित किया गया है, यह मूल प्रक्रिया का PID है
  • में /proc/, आपके पास प्रत्येक प्रक्रियाओं के पीआईडी ​​के साथ कुछ डायर हैं। फिर, यदि आप cat /proc/$PPID/comm, आप पीआईडी ​​के कमांड नाम को प्रतिध्वनित करते हैं

आदमी की खरीद की जाँच करें


1
यह सबसे अच्छा जवाब है। procfs एक कर्नेल एपीआई है। एक कमांड निष्पादित करें और आउटपुट को पार्स करना एक बकवास है।
मैसिमो

यह संभावित रूप से सबसे पोर्टेबल भी है, PPIDपोसिक्स मानक के हिस्से के रूप में परिभाषित किया गया है, इसलिए किसी भी पोसिक्स आज्ञाकारी शेल को उचित रूप से स्थापित किया जाना चाहिए। Pubs.opengroup.org/onlinepubs/9699919799/utilities/… पर
RobV

2

pstreeकमांड नाम से उपयोग करना

का उपयोग करते हुए pstreeबच्चे प्रक्रिया नाम से खोज और माता-पिता, दादा-दादी और बच्चे प्रक्रिया के किसी भी बच्चों के साथ प्रक्रिया ID (पीआईडी) प्राप्त कर सकते हैं आप:

$ pstree -hp | grep sleep
           |-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(8414)

इस मामले sleepमें चाइल्ड कमांड है और यह पीआईडी ​​है 8414। यह मूल आईडी 841 है और इसे कहा जाता है display-auto-brightness। दादा-दादी एक शेल ( sh) है जिसमें एक प्रक्रिया आईडी है 839। महान-दादा-दादी cronएक प्रक्रिया आईडी के साथ है 795। महान-परदादा भी cronएक प्रक्रिया आईडी के साथ है 763

यदि आप sleepनाम के बजाय प्रोसेस आईडी द्वारा खोजना चाहते हैं, तो आप इसका उपयोग कर सकते हैं:

$ pstree -hp | grep 14653
           |-cron(763)---cron(795)---sh(839)---display-auto-br(841)---sleep(14653)

नोटिस की sleepप्रक्रिया आईडी बदल गई 14653। अभिभावक (पीआईडी ​​841) 1 मिनट के लिए सोता है, एक दूसरे विभाजन के लिए उठता है और फिर एक नई sleepकमांड शुरू करता है जिसे एक नई प्रक्रिया आईडी मिलती है। यह एक और कारण है कि sleepप्रोसेस आईडी द्वारा खोजना आसान है।

इस कोड से लिया गया था: सूर्योदय और सूर्यास्त के आधार पर प्रदर्शन चमक को स्वचालित रूप से समायोजित करें और इस प्रश्न के लिए अनुकूलित करें।


नेस्टेड चेन को देखने के लिए बूट प्रक्रिया पर वापस जाने के लिए नाम के बजाय PID का उपयोग करें:

$ pstree -aps 8541
systemd,1 splash fastboot kaslr
  └─cron,763 -f
      └─cron,795 -f
          └─sh,839 -c    /usr/local/bin/display-auto-brightness
              └─display-auto-br,841 /usr/local/bin/display-auto-brightness
                  └─sleep,8541 60

नोट: एक और मिनट बीत चुका है और नींद की कमान को एक नया पीआईडी ​​(8541) मिलता है।


आपके उदाहरण में, इस विधि ने पीआईडी ​​807 के साथ क्रोन प्रक्रिया के लिए काम नहीं किया होगा।
ओलरिन

@ ऑरलिन दोनों उदाहरणों में आप एक ही लाइन पर 807या उससे cronआगे बढ़ सकते हैं और यदि बच्चे पैदा हो गए हों तो अधिक बच्चों को भी लाइन में लिया जाएगा। लेकिन सवाल माता-पिता को खोजने का था, सभी बच्चों का नहीं।
विनयुनुच्स

बिल्कुल सही - आप उस आउटपुट के साथ PID 807 के माता-पिता को कैसे ढूंढते हैं? आप नहीं कर सकते, क्योंकि यह 807 के माता-पिता को शामिल नहीं करता है।
Olorin

@ ऑरलिन क्रोन का जनक systemd है जो PID है 1। मुझे नहीं लगता कि आप पीआईडी ​​1 को मार सकते हैं
विनयुनुच्स

मैंने कुछ भी मारने के बारे में कुछ नहीं कहा। बस स्पष्ट करने के लिए, अब आप दावा कर रहे हैं कि कमांड नाम के लिए pstree या ग्रीपिंग की पहली पंक्ति लेने से हमेशा पेरेंट PID मिलेगा?
ओवलिन

0

ps -efj उसी के लिए भी इस्तेमाल किया जा सकता है।

उदाहरण के लिए,

> ps -efj | head
UID        PID  PPID  PGID   SID  C STIME TTY          TIME CMD
root         1     0     1     1  0 Jul01 ?        00:00:13 /sbin/init splash
root         2     0     0     0  0 Jul01 ?        00:00:00 [kthreadd]
root         3     2     0     0  0 Jul01 ?        00:00:02 [ksoftirqd/0]
root         5     2     0     0  0 Jul01 ?        00:00:00 [kworker/0:0H]
root         7     2     0     0  0 Jul01 ?        00:06:44 [rcu_sched]
root         8     2     0     0  0 Jul01 ?        00:00:00 [rcu_bh]
root         9     2     0     0  0 Jul01 ?        00:00:00 [migration/0]
root        10     2     0     0  0 Jul01 ?        00:00:08 [watchdog/0]
root        11     2     0     0  0 Jul01 ?        00:00:08 [watchdog/1]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.