นี่pstree
เป็นวิธีแก้ปัญหาที่ดีมาก แต่ก็เงียบเล็กน้อย ฉันใช้ps --forest
แทน แต่ไม่ใช่สำหรับPID
( -p
) เพราะมันพิมพ์เฉพาะกระบวนการที่เฉพาะเจาะจง แต่สำหรับเซสชั่น ( -g
) มันสามารถพิมพ์ข้อมูลใด ๆ ที่ps
สามารถพิมพ์ในต้นไม้ศิลปะ ASCII แฟนซีที่กำหนด-o
ตัวเลือก
ดังนั้นข้อเสนอแนะของฉันสำหรับปัญหานี้:
ps --forest -o pid,tty,stat,time,cmd -g 2795
หากกระบวนการไม่ใช่ผู้นำเซสชันคุณต้องใช้กลอุบายเพิ่มเติมเล็กน้อย:
ps --forest -o pid,tty,stat,time,cmd -g $(ps -o sid= -p 2795)
สิ่งนี้จะได้รับ session id (SID) ของกระบวนการปัจจุบันก่อนแล้วจึงเรียก ps อีกครั้งด้วย sid นั้น
หากไม่ต้องการส่วนหัวคอลัมน์ให้เพิ่ม '=' หลังจากนิยามคอลัมน์แต่ละคอลัมน์ในตัวเลือก '-o' เช่น:
ps --forest -o pid=,tty=,stat=,time=,cmd= -g $(ps -o sid= -p 2795)
ตัวอย่างการรันและผลลัพธ์:
$ ps --forest -o pid=,tty=,stat=,time=,cmd= -g $(ps -o sid= -p 30085)
27950 pts/36 Ss 00:00:00 -bash
30085 pts/36 S+ 00:00:00 \_ /bin/bash ./loop.sh
31888 pts/36 S+ 00:00:00 \_ sleep 5
น่าเสียดายที่นี่ใช้งานไม่ได้screen
เพราะมันตั้งค่า sid สำหรับหน้าจอสำหรับเด็กแต่ละคนและหลานทุบตีทั้งหมด
เพื่อให้ได้กระบวนการทั้งหมดที่เกิดจากกระบวนการต้นไม้ทั้งหมดจะต้องมีการสร้าง ฉันใช้awkสำหรับเรื่องนั้น PID => ,child,child...
ตอนแรกก็สร้างอาร์เรย์กัญชาจะมีทั้งหมด ในตอนท้ายมันจะเรียกฟังก์ชั่นวนซ้ำเพื่อแยกกระบวนการลูกทั้งหมดของกระบวนการที่กำหนด ผลลัพธ์จะถูกส่งไปยังอีกps
รูปแบบหนึ่งเพื่อจัดรูปแบบผลลัพธ์ PID ที่แท้จริงจะต้องมีการเขียนเป็นอาร์กิวเมนต์เพื่อawkแทน<PID>
:
ps --forest $(ps -e --no-header -o pid,ppid|awk -vp=<PID> 'function r(s){print s;s=a[s];while(s){sub(",","",s);t=s;sub(",.*","",t);sub("[0-9]+","",s);r(t)}}{a[$2]=a[$2]","$1}END{r(p)}')
สำหรับกระบวนการหน้าจอ (pid = 8041) เอาต์พุตตัวอย่างจะมีลักษณะดังนี้:
PID TTY STAT TIME COMMAND
8041 ? Ss 0:00 SCREEN
8042 pts/8 Ss 0:00 \_ /bin/bash
8092 pts/8 T 0:00 \_ vim test_arg test_server
12473 pts/8 T 0:00 \_ vim
12972 pts/8 T 0:00 \_ vim
ps auxf
แต่เริ่มต้นด้วย