Как я могу получить все дерево процессов, порожденное данным процессом, отображаемым как дерево, и только это дерево, то есть никакие другие процессы?
Вывод может выглядеть, например, как
4378 ? Ss 0:10 SCREEN
4897 pts/16 Ss 0:00 \_ -/bin/bash
25667 pts/16 S+ 0:00 | \_ git diff
25669 pts/16 S+ 0:00 | \_ less -FRSX
11118 pts/32 Ss+ 0:00 \_ -/bin/bash
11123 pts/32 S+ 0:00 \_ vi
Я не мог получить желаемый результат чисто с параметрами ps
.
Следующее дает желаемый результат, но кажется немного сложным:
#!/bin/bash
pidtree() {
echo -n $1 " "
for _child in $(ps -o pid --no-headers --ppid $1); do
echo -n $_child `pidtree $_child` " "
done
}
ps f `pidtree 4378`
У кого-нибудь есть более простое решение?
ps auxf
.Ответы:
Это
pstree
очень хорошее решение, но оно немного сдержанное. Я используюps --forest
вместо этого. Но не дляPID
(-p
), потому что он печатает только определенный процесс, но для сеанса (-g
). Он может распечатать любую информацию, которуюps
можно распечатать в причудливом дереве ASCII, определяющем эту-o
опцию.Итак, мое предложение по этой проблеме:
Если процесс не является лидером сеанса, то нужно применить немного больше трюка:
Сначала он получает идентификатор сеанса (SID) текущего процесса, а затем снова вызывает ps с этим sid.
Если заголовки столбцов не нужны, добавьте «=» после каждого определения столбца в параметрах «-o», например:
Пример запуска и результат:
К сожалению, это не работает, так
screen
как он устанавливает sid для каждого дочернего экрана и всех внуков.Чтобы все процессы порождались процессом, нужно построить все дерево. Я использовал awk для этого. Сначала он создает массив хешей, содержащий все
PID => ,child,child...
. В конце она вызывает рекурсивную функцию для извлечения всех дочерних процессов данного процесса. Результат передается другомуps
для форматирования результата. Фактический PID должен быть записан как аргумент awk вместо<PID>
:Для процесса SCREEN (pid = 8041) пример вывода выглядит следующим образом:
источник
ps
бы была опция флага фильтра только для фильтрации всех потомков PID.где
${pid}
pid родительского процесса.В Gentoo Linux
pstree
находится в пакете "psmisc", по-видимому, расположенном по адресуhttp://psmisc.sourceforge.net/источник
pstree
, но пропустил более подробный формат вывода. Тем не менее,pstree -p <pid>
по крайней мере, распечатать пидс, который достаточно близко.sed
все это .. ммм, это работает :)pstree -pn 4008 |grep -o "([[:digit:]]*)" |grep -o "[[:digit:]]*"
Вот моя версия, которая запускается мгновенно (потому что
ps
выполняется только один раз). Работает в bash и zsh.источник
echo $1
в первый цикл for и изменив его наecho $i
.Я создал небольшой скрипт bash для создания списков pid дочернего процесса (ов) родителя. Рекурсивно, пока не найдет последний дочерний процесс, у которого нет дочерних процессов. Это не дает вам вид дерева. Он просто перечисляет все pid.
Первый аргумент list_offspring - родительский pid
источник
ps -H -g "$pid" -o comm
дерево не добавляется само по себе, это просто список процессов.
дает например
источник
-H
Опция используется для отображения дерева процессов или «иерархия процесса (лес)»Я работал, чтобы найти решение точно такой же проблемы. По сути, ps manpage не документирует никаких опций, позволяющих делать то, что мы хотим, с помощью одной команды. Вывод: нужен скрипт.
Я придумал сценарий, очень похожий на ваш. Я вставил его в мой ~ / .bashrc, чтобы я мог использовать его из любой оболочки.
источник
По пути в командной строке:
это выводит:
более элегантный способ этого способа заключается в определении функции в
.bashrc
:затем в командной строке запустите:
источник
Это дает только pid + children pids на каждой строке, что полезно для дальнейшей обработки.
источник
Я сделал аналогичный сценарий на основе вышеупомянутого Филиппа
Это выводит все дочерние, внучатые и т. Д. Pids в формате с разделителями-пробелами. Это, в свою очередь, может быть подано в PS, как в
источник
для всего процесса - pstree -a показать пользователем - pstree user
источник