Ответ 1
Просто хочу документировать мои действия, связанные с этой проблемой.
Скажем, я выполняю это в терминале:
~$ echo "read -p 'Press Enter'" > mytest.sh
~$ chmod +x mytest.sh
~$ bash -c bash
~$ bash -c ./mytest.sh
... и оставить его в ожидании в приглашении ввода read
. Тогда я всегда могу найти pid mytest.sh
как:
$ ps axf | grep mytest
20473 pts/2 S+ 0:00 | | \_ grep --color=tty mytest
20308 pts/5 S+ 0:00 | | \_ bash -c ./mytest.sh
... однако, я хотел бы вывести дерево ps axf
, ограниченное некоторым родителем mytest.sh
; глядя на полный ps axf
, мы можем видеть иерархию:
$ ps axf
1489 ? Sl 1:39 \_ gnome-terminal --sm-client-id 106ab86
1511 ? S 0:00 | \_ gnome-pty-helper
...
20238 pts/5 Ss 0:00 | \_ bash
20274 pts/5 S 0:00 | | \_ bash
20308 pts/5 S+ 0:00 | | \_ bash -c ./mytest.sh
...
Затем, скажем, я не хочу "сканировать" gnome-terminal
(1489) как родительский, но вместо этого хочу начать с bash
(20238). Итак, я бы хотел получить этот вывод:
$ ps f -p 20238 20274 20308
PID TTY STAT TIME COMMAND
20238 pts/5 Ss 0:00 bash
20274 pts/5 S 0:00 \_ bash
20308 pts/5 S+ 0:00 \_ bash -c ./mytest.sh
... кроме, я не хочу копировать/вставлять дочерние PID вручную:)
Я мог бы использовать pstree
:
$ pstree -a -p 20238
bash,20238
└─bash,20274
└─bash,20308 -c ./mytest.sh
$ pstree -p 20238
bash(20238)───bash(20274)───bash(20308)
... К сожалению, результат не совсем такой же, как в ps axf
, который я предпочитаю.
Итак, я могу использовать pstree
просто для получения дочерних PID:
$ pstree -p 20238 | sed 's/(/\n(/g' | grep '(' | sed 's/(\(.*\)).*/\1/'
20238
20274
20308
$ pstree -p 20238 | sed 's/(/\n(/g' | grep '(' | sed 's/(\(.*\)).*/\1/' | tr "\n" ,
20238,20274,20308,
а затем используйте их для получения дерева ps axf
, основанного только на PID родителя:
$ ps f -p $(pstree -p 20238 | sed 's/(/\n(/g' | grep '(' | sed 's/(\(.*\)).*/\1/' | tr "\n" " ")
PID TTY STAT TIME COMMAND
20238 pts/5 Ss 0:00 bash
20274 pts/5 S 0:00 \_ bash
20308 pts/5 S+ 0:00 \_ bash -c ./mytest.sh
Хорошо, надеюсь, это поможет кому-то,
Ура!