Bagaimana saya bisa memperlihatkan pohon proses terminal shell termasuk anak-anak?

30

Ketika skrip diluncurkan dari command prompt shell akan menelurkan subproses untuk skrip itu. Saya ingin menunjukkan hubungan antara proses level terminal dan anak-anaknya psdalam output gaya pohon.
Bagaimana saya bisa melakukan ini?

Apa yang saya coba sejauh ini

mengajukan: script.sh

#!/bin/bash

ps -f -p$1

Kemudian saya memohon script dari baris perintah yang melewati id proses dari terminal shell:

$ ./script.sh $$

Yang saya inginkan adalah sesuatu seperti ini

  • proses shell tingkat atas (terminal)
  • ./script.sh
  • proses untuk psperintah itu sendiri
USER    PID  [..]
ubuntu 123     -bash
ubuntu 1234    \_ bash ./script.sh
ubuntu 12345      \_ ps auxf 

apa yang saya dapatkan adalah:

  PID TTY      STAT   TIME COMMAND
14492 pts/24   Ss     0:00 -bash
the_velour_fog
sumber
2
Kenapa tidak digunakan pstree?
muru
@uru saya mencoba pstreedan tidak bisa menghasilkan output yang bermakna, saya pikir pstree $$baru saja menghasilkan bash--pstreetidak persis apa yang saya cari.
the_velour_fog
Bagaimana bukan apa yang Anda cari? Anda telah mengganti skrip dan ps, jadi apa lagi yang Anda harapkan untuk dilihat kecuali untuk pstree?
muru
@muru hak Anda secara teknis apa yang saya inginkan, tetapi terlalu minim. yaitu bagaimana Anda tahu pasti proses mana yang Anda lihat tanpa PID seperti ps menunjukkannya output tabel?
the_velour_fog
4
pstree -p $$? Atau, jika Anda ingin lebih banyak menampilkan baris perintah pstree -pa $$,. Atau, jika Anda ingin menunjukkan semua proses induk naik pstree -psa $$,.
muru

Jawaban:

30

Mencoba

# 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
GILBERTO LINS
sumber
5
Pertanyaannya tersirat mencari pohon proses mulai dari proses tertentu, mengambil $1argumen ke skrip atau menggunakan $$untuk melihat pohon mulai dari shell saat ini ... Dapatkah Anda memperbarui jawaban Anda untuk memasukkan informasi tentang cara mendapatkan hutan mulai dari proses tertentu?
filbranden
23

Saya menemukannya setelah membaca jawaban pengguna super ini , mencatat komentar ini

Tetapi tidak untuk PID (-p) karena hanya mencetak proses spesifik, tetapi untuk sesi (-g)

dan bereksperimen

ps f -g<PID>

hasil

$ ./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
the_velour_fog
sumber
3
dari halaman manual:OUTPUT MODIFIERS: f ASCII-art process hierarchy (forest)
phyatt
1

Anda dapat menggunakan perintah ps f -g <PID>dan membuat stat proses root untuk 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]
Richard J.
sumber
1

Coba ini:

 $ 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]
sluge
sumber