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)
इससे वर्तमान प्रक्रिया का सेशन आईडी (SID) पहले हो जाता है और फिर उस साइड से पुन: PS को कॉल किया जाता है।
यदि कॉलम हेडर की जरूरत नहीं है, तो '-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
क्योंकि यह प्रत्येक बाल स्क्रीन और सभी पोते के लिए बैश सेट करता है।
एक प्रक्रिया द्वारा पैदा की गई सभी प्रक्रियाओं को प्राप्त करने के लिए पूरे पेड़ को बनाने की आवश्यकता होती है। मैंने उसके लिए awk का इस्तेमाल किया । सबसे पहले यह सभी को समाहित करने के लिए एक हैश सरणी बनाता है PID => ,child,child...
। अंत में यह किसी दिए गए प्रक्रिया के सभी बच्चे को निकालने के लिए एक पुनरावर्ती कार्य को बुलाता है। परिणाम ps
को प्रारूपित करने के लिए परिणाम दूसरे को दिया जाता है । वास्तविक पीआईडी के लिए एक तर्क के रूप में लिखा जाना है 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
।