ค้นหาลูกของกระบวนการ


15

มีวิธีใดบ้างที่จะรู้ว่าใครเป็นลูกของกระบวนการเฉพาะ ตัวอย่างเช่นเด็ก ๆ ที่ ID ผู้ปกครองของพวกเขาเป็น foo?

คำตอบ:


26

คุณกำลังมองหาpstreeคำสั่ง pstreeโดยตัวมันเองจะแสดงรายการกระบวนการทั้งหมดในรูปแบบต้นไม้ (เช่นlsblkไม่) คุณสามารถใช้การ-pตั้งค่าสถานะเพื่อรับ PID ที่แสดงรายการเช่นกันและ-sเพื่อแสดงกระบวนการหลักด้วย:

$ pstree -p 602
udisksd(602)-+-{cleanup}(607)
             |-{gdbus}(605)
             |-{gmain}(603)
             `-{probing-thread}(606)

A (อาจ) วิธีที่เป็นไปตาม POSIX ในการรับ PID ของเด็ก (ที่ฉันได้กล่าวถึงในความคิดเห็นอื่น ๆ ):

ps -o ppid= -o pid= -A | awk '$1 == <some pid>{print $2}'

สิ่งนี้บอกpsให้เขียน parent PID และ PID ของกระบวนการทั้งหมด (โดยไม่มีส่วนหัว) จากนั้นใช้awkเพื่อดูว่าบรรทัดใดมี PID ที่กำหนดในฟิลด์แรก (parent PID) และพิมพ์ฟิลด์ที่สองที่เกี่ยวข้อง (child PID)


10

หากคุณเพียงต้องการที่จะเห็นเด็ก ๆ ทันทีของกระบวนการที่มี PID คือ123คุณสามารถใช้ตัวเลือกpsคำสั่ง--ppid:

ps --ppid 123

คุณสามารถรวมมันเข้ากับpidofคำสั่งเพื่อรับค่าย่อยของกระบวนการตามชื่อเช่นกำหนดกระบวนการที่เรียกว่าfoo

ps --ppid $(pidof foo)

10

ตัวเลือกอื่นคือการใช้การตรวจสอบระบบ (มาพร้อมติดตั้งไว้แล้ว) ในตัวเลือก "การอ้างอิง" ของ SM Menubar ภายใต้ "มุมมอง" เพื่อรับการตอบกลับด้วยภาพแสดงกระบวนการของผู้ปกครองและเด็กเช่นการแสดงในภาพหน้าจอด้านล่าง

ฉันชอบ CL (Command Line) ด้วยตัวเองและแนะนำว่าผู้ที่ใช้ Linux ในกรณีนี้ Ubuntu เป็นประจำทุกวันใช้เวลาอย่างชาญฉลาดในการเรียนรู้คำสั่งพื้นฐานผ่านแอพพลิเคชั่น GUI หรืออย่างน้อยก็สามารถเป็นผู้เชี่ยวชาญ ระดับหนึ่ง!

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่


1
OT: ธีมคืออะไร?
muru

1
ฉันใช้ Ubuntu + GnomeShell 3.2.1 ชุดรูปแบบนี้เรียกว่า "AdwaitaDark" ซึ่งเป็นชุดรูปแบบ GTK3 แต่ได้รับการปรับแต่งและไม่พร้อมใช้งานเหมือนที่คุณเห็นในภาพหน้าจอ
v2r

6

ฉันไม่ใช่ผู้เชี่ยวชาญ แต่การอ่านคำตอบข้างต้นดูเหมือนว่าฉันอาจมีวิธีโดยตรงมากกว่าในการทำเช่นนี้ผ่านระบบไฟล์ proc เช่นสำหรับการใช้งานเชิงโปรแกรมในสคริปต์แทนที่จะแสดงผลแบบมนุษย์อ่านได้ และแน่นอนมี: สำหรับกระบวนการที่มีรหัส ID $ mypid กระบวนการที่เด็กมีการระบุไว้ใน

/proc/$mypid/task/$mypid/children

เช่น

$ cat /proc/3123/task/3123/children 
3131 3133

ในทำนองเดียวกันคุณสามารถรับ ID กระบวนการหลักผ่านรายการ "PPid" ในไฟล์

/proc/$mypid/task/$mypid/status

เช่น

$ grep PPid /proc/3131/task/3131/status
PPid:   3123
$ grep PPid /proc/3131/task/3131/status | cut -f2
3123

ฉันไม่แน่ใจว่าอุปกรณ์พกพานี้เหนือกว่าระบบ Linux อย่างไร


1
หากการพกพาเป็นเรื่องที่น่ากังวล: ps -o ppid= -o pid= -A | awk '$1 == <some pid>' | cut -f2ควรเป็นไปตาม POSIX
muru
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.