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)
এটি প্রথমে বর্তমান প্রক্রিয়ার সেশন আইডি (এসআইডি) পায় এবং তারপরে সেই এসিডের সাথে আবার পিএস কল করে।
কলামের শিরোনামগুলির প্রয়োজন না হলে '-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
এটি কাজ করে না কারণ এটি প্রতিটি চাইল্ড স্ক্রিন এবং সমস্ত নাতনি বাশের জন্য সিড সেট করে।
কোনও প্রক্রিয়া দ্বারা উদ্ভূত সমস্ত প্রক্রিয়াগুলি পেতে পুরো গাছটি তৈরি করা দরকার। আমি এর জন্য বিশ্রী ব্যবহার করেছি। প্রথমে এটিগুলিকে ধারণ করার জন্য একটি হ্যাশ অ্যারে তৈরি করে PID => ,child,child...
। শেষে এটি প্রদত্ত প্রক্রিয়াটির সমস্ত শিশু প্রক্রিয়া নিষ্কাশনের জন্য একটি পুনরাবৃত্ত ফাংশন কল করে। ফলাফলটি ps
বিন্যাস করতে অন্যটিতে পাস করা হয় । আসল পিআইডি এর পরিবর্তে অ্যাডকে আর্গুমেন্ট হিসাবে লিখতে হবে <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)}')
একটি স্ক্রিন প্রক্রিয়া (পিড = 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
।