วิธีรับ pid แม่จากลูกที่ได้รับ pid?
ฉันรู้ว่าฉันสามารถตรวจสอบได้ด้วยตนเองภายใต้ / proc ฉันสงสัยว่ามีวิธีที่ชาญฉลาด / ดีกว่าเพื่อให้บรรลุใน Ubuntu หมายเหตุผู้ปกครองอาจหรือไม่อาจถูกฆ่า
ขอบคุณ
วิธีรับ pid แม่จากลูกที่ได้รับ pid?
ฉันรู้ว่าฉันสามารถตรวจสอบได้ด้วยตนเองภายใต้ / proc ฉันสงสัยว่ามีวิธีที่ชาญฉลาด / ดีกว่าเพื่อให้บรรลุใน Ubuntu หมายเหตุผู้ปกครองอาจหรือไม่อาจถูกฆ่า
ขอบคุณ
คำตอบ:
ใช้ 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)
ppid= แต่ก่อน pid ดูเหมือนจะจำเป็น ฉันได้ผลลัพธ์ที่แตกต่างถ้าฉันไม่ได้ระบุ
echo $PPID
หากคุณต้องการคำสั่งจาก pid หลักนี้:
cat /proc/$PPID/comm
หากคุณต้องการบรรทัดคำสั่งแบบเต็ม (พร้อมตัวเลือกทั้งหมด):
cat /proc/$PPID/cmdline
$PPID ถูกกำหนดโดยเชลล์มันเป็น PID ของกระบวนการพาเรนต์/proc/คุณมี dirs ด้วย PID ของแต่ละกระบวนการ จากนั้นถ้าคุณcat /proc/$PPID/commคุณสะท้อนชื่อคำสั่งของ PIDPPIDถูกกำหนดให้เป็นส่วนหนึ่งของมาตรฐาน POSIX ดังนั้นเชลล์ที่เข้ากันได้กับ POSIX ควรตั้งค่านี้อย่างเหมาะสม ดูpubs.opengroup.org/onlinepubs/9699919799/utilities/…
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)
807หรือหรือcronและบรรทัดเดียวกันจะถูกเรียกใช้ซ้ำเช่นเดียวกับเด็ก ๆ มากขึ้นถ้าวางไข่ แต่คำถามก็เกี่ยวกับการหาพ่อแม่ไม่ใช่เด็กทุกคน
1PID ฉันไม่คิดว่าคุณจะฆ่า PID 1 ได้
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]
ps -o args ...กับผลลัพธ์ แต่มีกลิ่นนิดหน่อย