Як я можу показати дерево процесної оболонки терміналу, включаючи дітей?


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

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

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

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]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.