Как я могу показать дерево процессов оболочки терминала, включая детей?

30

Когда скрипт запускается из командной строки, оболочка порождает подпроцесс для этого скрипта. Я хочу показать эту связь между процессом на уровне терминала и его дочерними элементами, используя psвывод в виде дерева.
Как я могу это сделать?

Что я пробовал до сих пор

файл: script.sh

#!/bin/bash

ps -f -p$1

Затем я вызываю скрипт из командной строки, передавая идентификатор процесса оболочки терминала:

$ ./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
the_velour_fog
источник
2
Почему бы не использовать pstree?
Муру
@muru Я пытался pstreeи не смог добиться значимого результата, думаю, pstree $$только что произвелbash--pstree не совсем то, что я искал.
the_velour_fog
Как это не то, что вы ищете? Вы заменили сценарий и ps, так что еще вы ожидаете увидеть, кромеpstree ?
Муру
@muru ваше право это технически то, что я хотел, но слишком мало. то есть как вы знаете наверняка, какие процессы вы смотрите без PID, как ps показывает это в таблице вывода?
the_velour_fog
4
pstree -p $$? Или, если вы хотите больше из командной строки показать,pstree -pa $$ . Или, если вы хотите показать все родительские процессы, идущие вверх pstree -psa $$.
Муру

Ответы:

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
GILBERTO LINS
источник
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
the_velour_fog
источник
3
со страницы OUTPUT MODIFIERS: f ASCII-art process hierarchy (forest)
руководства
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]
sluge
источник