ฉันจะแสดงแผนผังกระบวนการของเทอร์มินัลเชลล์รวมถึงลูก ๆ ได้อย่างไร


30

เมื่อสคริปต์ถูกเรียกใช้จากพรอมต์คำสั่งเชลล์จะวางไข่ subprocess สำหรับสคริปต์นั้น ฉันต้องการแสดงความสัมพันธ์ระหว่างกระบวนการระดับเทอร์มินัลและลูก ๆ ของมันที่ใช้psในการแสดงผลแบบต้นไม้
ฉันจะทำสิ่งนี้ได้อย่างไร

สิ่งที่ฉันได้ลองมาแล้ว

ไฟล์: script.sh

#!/bin/bash

ps -f -p$1

จากนั้นฉันจะเรียกใช้สคริปต์จากบรรทัดคำสั่งที่ส่งผ่านใน id กระบวนการของเทอร์มินัลเชลล์:

$ ./script.sh $$

สิ่งที่ฉันต้องการคืออะไรแบบนี้

  • กระบวนการเชลล์ระดับบนสุด (เทอร์มินัล)
  • ./script.sh
  • กระบวนการสำหรับpsคำสั่งเอง
USER    PID  [..]
ubuntu 123     -bash
ubuntu 1234    \_ bash ./script.sh
ubuntu 12345      \_ ps auxf 

สิ่งที่ฉันได้รับคือ:

  PID TTY      STAT   TIME COMMAND
14492 pts/24   Ss     0:00 -bash

2
ทำไมไม่ใช้pstree?
muru

@muru ฉันพยายามpstreeและไม่สามารถสร้างผลผลิตที่มีความหมายได้ฉันคิดว่าpstree $$เพิ่งสร้างbash--pstreeไม่ได้ตรงตามที่ฉันต้องการ
the_velour_fog

ไม่ใช่สิ่งที่คุณกำลังมองหา? คุณได้แทนที่สคริปต์และpsดังนั้นสิ่งอื่นที่คุณคาดหวังให้เห็นยกเว้นpstreeอะไรอีก
muru

@muru สิทธิ์ของคุณในทางเทคนิคสิ่งที่ฉันต้องการ แต่น้อยเกินไป เช่นคุณจะทราบได้อย่างไรว่ากระบวนการใดที่คุณกำลังดูอยู่โดยไม่มี PID เช่น ps แสดงให้เห็นว่าเป็นตารางผลลัพธ์
the_velour_fog

4
pstree -p $$? หรือถ้าคุณต้องการให้บรรทัดคำสั่งแสดงมากขึ้นpstree -pa $$มากขึ้น หรือถ้าคุณต้องการที่จะแสดงกระบวนการผู้ปกครองทั้งหมดขึ้นpstree -psa $$ไป
muru

คำตอบ:


30

ลอง

# ps -aef --forest
root     114032   1170  0 Apr05 ?        00:00:00  \_ sshd: root@pts/4
root     114039 114032  0 Apr05 pts/4    00:00:00  |   \_ -bash
root      56225 114039  0 13:47 pts/4    00:00:16  |       \_ top
root     114034   1170  0 Apr05 ?        00:00:00  \_ sshd: root@notty
root     114036 114034  0 Apr05 ?        00:00:00  |   \_ /usr/libexec/openssh/sftp-server
root     103102   1170  0 Apr06 ?        00:00:03  \_ sshd: root@pts/0
root     103155 103102  0 Apr06 pts/0    00:00:00  |   \_ -bash
root     106798 103155  0 Apr06 pts/0    00:00:00  |       \_ su - postgres
postgres 106799 106798  0 Apr06 pts/0    00:00:00  |           \_ -bash
postgres  60959 106799  0 14:39 pts/0    00:00:00  |               \_ ps -aef --forest
postgres  60960 106799  0 14:39 pts/0    00:00:00  |               \_ more

5
คำถามโดยนัยมองหาแผนผังกระบวนการเริ่มต้นที่กระบวนการเฉพาะ$1โต้แย้งอาร์กิวเมนต์กับสคริปต์หรือใช้$$เพื่อดูแผนผังเริ่มต้นที่เชลล์ปัจจุบัน ... คุณสามารถอัปเดตคำตอบของคุณเพื่อรวมข้อมูลเกี่ยวกับวิธีเริ่มฟอเรสต์ที่ กระบวนการเฉพาะ?
filbranden

23

ฉันพบมันหลังจากอ่าน คำตอบของผู้ใช้ระดับสูงนี้แล้วสังเกตเห็นความคิดเห็นนี้

แต่ไม่ใช่สำหรับ PID (-p) เพราะมันจะพิมพ์เฉพาะกระบวนการเฉพาะ แต่สำหรับเซสชัน (-g)

และการทดลอง

ps f -g<PID>

ผล

$ ./script.sh $$
  PID TTY      STAT   TIME COMMAND
14492 pts/24   Ss     0:00 -bash
 9906 pts/24   S+     0:00  \_ bash ./script.sh 14492
 9907 pts/24   R+     0:00      \_ ps f -g14492

3
จากหน้าคน:OUTPUT MODIFIERS: f ASCII-art process hierarchy (forest)
phyatt

1

คุณสามารถใช้คำสั่งps f -g <PID>และสถิติกระบวนการรูตสำหรับPID:

#> ps f -g 0

PID TTY      STAT   TIME COMMAND
2 ?        S      0:00 [kthreadd]
3 ?        S      0:01  \_ [ksoftirqd/0]
7 ?        S      0:19  \_ [rcu_sched]

1

ลองสิ่งนี้:

 $ ps -afx
  PID TTY      STAT   TIME COMMAND
    2 ?        S      0:00 [kthreadd]
    4 ?        I<     0:00  \_ [kworker/0:0H]
    6 ?        I<     0:00  \_ [mm_percpu_wq]
    7 ?        S      0:14  \_ [ksoftirqd/0]
    8 ?        I      0:34  \_ [rcu_sched]
    9 ?        I      0:00  \_ [rcu_bh]
   10 ?        S      0:00  \_ [migration/0]
   11 ?        S      0:00  \_ [watchdog/0]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.