ฉันจะรับ ID กระบวนการหลักของกระบวนการย่อยที่กำหนดได้อย่างไร


49

วิธีรับ pid แม่จากลูกที่ได้รับ pid?

ฉันรู้ว่าฉันสามารถตรวจสอบได้ด้วยตนเองภายใต้ / proc ฉันสงสัยว่ามีวิธีที่ชาญฉลาด / ดีกว่าเพื่อให้บรรลุใน Ubuntu หมายเหตุผู้ปกครองอาจหรือไม่อาจถูกฆ่า

ขอบคุณ

คำตอบ:


58

วิธีรับพาเรนต์ PID (PPID) จาก ID กระบวนการของเด็ก (PID) โดยใช้บรรทัดคำสั่ง

ใช้ ps -o ppid=

  • เช่นps -o ppid= 2072ผลตอบแทนที่2061ซึ่งคุณสามารถใช้ในสคริปต์ ฯลฯps -o ppid= -C fooให้ PPID fooของกระบวนการที่มีคำสั่ง นอกจากนี้คุณยังสามารถใช้แบบเก่า:ps | grepps -eo ppid,comm | grep '[f]oo'
  • คำอธิบายแบบเต็ม: ps -f 2072ส่งคืน
    โพสต์ UID PID   PPID   C เวลา TTY สถานะ CMD
    izx 2072   2061   0 07:16? S 0:00 / usr / lib / pulseaudio / pulse / gconf-helper
    
  • pstreeความสัมพันธ์คือpstree -s -p 2072:
    init (1) ───pulseaudio (2061) ───gconfผู้ช่วย (2072)
    

คุณรู้วิธีที่จะทำให้การเรียก pstree แสดง (คำสั่ง + ข้อโต้แย้ง) โดยไม่ต้องแยกบรรทัด? การติดตั้งของฉันจะแยกบรรทัดโดยอัตโนมัติหากฉันเพิ่มอาร์กิวเมนต์แม้ว่าผลลัพธ์จะพอดีกับหนึ่งบรรทัดได้อย่างง่ายดาย หน้าคนดูเหมือนจะพูดมาก แต่ก็ไม่มีเหตุผล วิธีแก้ปัญหาของฉันเกี่ยวข้องกับการดึง PID ออกจาก pstree และใช้ps -o args ...กับผลลัพธ์ แต่มีกลิ่นนิดหน่อย
John P

บางสิ่งบางอย่างที่ทำให้ฉันประหลาดใจ: พื้นที่หลังppid= แต่ก่อน pid ดูเหมือนจะจำเป็น ฉันได้ผลลัพธ์ที่แตกต่างถ้าฉันไม่ได้ระบุ
Gregory Arenius

8

การใช้ตัวแปรเท่านั้นเพื่อรับพาเรนต์ PID:

echo $PPID

หากคุณต้องการคำสั่งจาก pid หลักนี้:

cat /proc/$PPID/comm

หากคุณต้องการบรรทัดคำสั่งแบบเต็ม (พร้อมตัวเลือกทั้งหมด):

cat /proc/$PPID/cmdline

คำอธิบาย

  • $PPID ถูกกำหนดโดยเชลล์มันเป็น PID ของกระบวนการพาเรนต์
  • ใน/proc/คุณมี dirs ด้วย PID ของแต่ละกระบวนการ จากนั้นถ้าคุณcat /proc/$PPID/commคุณสะท้อนชื่อคำสั่งของ PID

ตรวจสอบproc คน


1
นี่คือคำตอบที่ดีที่สุด procfs เป็นเคอร์เนล API รันคำสั่งและแยกออกผลลัพธ์เป็นเรื่องไร้สาระ
Massimo

นี่ก็เป็นไปได้ที่จะพกพามากที่สุดPPIDถูกกำหนดให้เป็นส่วนหนึ่งของมาตรฐาน POSIX ดังนั้นเชลล์ที่เข้ากันได้กับ POSIX ควรตั้งค่านี้อย่างเหมาะสม ดูpubs.opengroup.org/onlinepubs/9699919799/utilities/…
RobV

2

ใช้pstreeโดยชื่อคำสั่ง

การใช้pstreeคุณสามารถค้นหาด้วยชื่อกระบวนการลูกและรับรหัสกระบวนการ (PID) พร้อมกับพ่อแม่ปู่ย่าตายายและลูก ๆ ของกระบวนการลูก:

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

ในกรณีนี้sleepคือคำสั่งของเด็กและก็ PID 8414เป็น มันเป็น ID ผู้ปกครอง 841 display-auto-brightnessและถูกเรียกว่า ปู่ย่าตายายเป็นเปลือก ( sh) ด้วยกระบวนการ ID 839ของ ดี-ปู่ย่าตายายคือcronมีกระบวนการ ID 795ของ ดีที่ดีที่ปู่ย่าตายายนี้ยังcronมีกระบวนการ ID 763ของ

หากคุณต้องการค้นหาด้วย ID กระบวนการsleepแทนชื่อคุณสามารถใช้:

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

สังเกตsleepกระบวนการ ID 14653เปลี่ยนไป พาเรนต์ (PID 841) หลับเป็นเวลา 1 นาทีตื่นขึ้นเป็นเสี้ยววินาทีจากนั้นเริ่มsleepคำสั่งใหม่ซึ่งได้รับรหัสกระบวนการใหม่ นี่เป็นอีกสาเหตุที่การค้นหาsleepง่ายกว่าการค้นหาด้วย ID กระบวนการ

รหัสนี้มาจาก: ปรับความสว่างของหน้าจอโดยอัตโนมัติตามพระอาทิตย์ขึ้นและตกและปรับให้เข้ากับคำถามนี้


ในการดูลูกโซ่ที่ซ้อนกันตลอดทางจนถึงกระบวนการบูตให้ใช้ 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

หมายเหตุ:อีกหนึ่งนาทีผ่านไปและคำสั่ง sleep ได้รับ PID ใหม่ (8541)


ในตัวอย่างของคุณวิธีนี้จะใช้ไม่ได้กับกระบวนการ cron ด้วย PID 807
Olorin

@Olorin ในตัวอย่างทั้งสองคุณสามารถ grep 807หรือหรือcronและบรรทัดเดียวกันจะถูกเรียกใช้ซ้ำเช่นเดียวกับเด็ก ๆ มากขึ้นถ้าวางไข่ แต่คำถามก็เกี่ยวกับการหาพ่อแม่ไม่ใช่เด็กทุกคน
WinEunuuchs2Unix

เผง - คุณจะพบ parent ของ PID 807 กับเอาต์พุตนั้นได้อย่างไร? คุณไม่สามารถ becvause จะไม่รวมถึงแม่ของ 807.
Olorin

@Olorin ผู้ปกครองของ cron เป็น systemd ซึ่งเป็น 1PID ฉันไม่คิดว่าคุณจะฆ่า PID 1 ได้
WinEunuuchs2Unix

ฉันไม่ได้พูดอะไรเกี่ยวกับการฆ่าอะไร เพียงชี้แจงให้ชัดเจนตอนนี้คุณกำลังอ้างว่าการรับ pstree หรือ grepping บรรทัดแรกสำหรับชื่อคำสั่งจะให้ PID หลักเสมอ
Olorin

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]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.