Получить список процессов, которые были разложены от моего текущего проколочного процесса?

Использование Awk:

awk -F'[:,]' '{gsub(/"/,""); printf "%s:%s\n", $(NF-4),$NF}' file
accord:67000
civic:40000
camry:40000
camry:2000
MKZ:20000
3
14.11.2018, 14:07
4 ответа

Если вы используете Linux, вы можете использовать straceдля отслеживания системных вызовов, используемых процессом. Например:

~ strace -e fork,vfork,clone,execve -fb execve -o log./foo.sh
foo bar
~ cat log
4817  execve("./foo.sh", ["./foo.sh"], [/* 42 vars */]) = 0
4817  clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4818
4818  execve("/bin/true", ["/bin/true"], [/* 42 vars */] <detached...>
4817  --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=4818, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
4817  clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4819
4817  clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4820
4820  execve("/bin/echo", ["/bin/echo", "foo", "bar"], [/* 42 vars */] <detached...>
4817  --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=4820, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
4817  +++ exited with 0 +++
4819  execve("/bin/sleep", ["sleep", "1"], [/* 42 vars */] <detached...>

Вы можете видеть, что сценарий разветвил три процесса (PID 4818, 4819, 4820 )с помощью системного вызова clone(2), а системные вызовы execve(2)в этих ответвленных процессах показывают выполненные команды.

  • -e fork,vfork,clone,execveограничивает вывод strace этими системными вызовами
  • -fследует за дочерними процессами
  • -b execveотсоединяется от процесса при достижении execve, поэтому мы не видим дальнейшего отслеживания дочерних процессов.
9
27.01.2020, 21:09
Команда

pgrep будет полезна. Используйте эти команды:

Распечатать PID каждого разветвленного процесса из процесса($pid):

pgrep -P $pid

Для получения более подробной информации о каждом разветвленном процессе используйте эту команду:

ps -fp `pgrep -P $pid`

, где $pid— идентификатор вашего процесса.

3
27.01.2020, 21:09
pstree -p `pgrep NetworkManager`
NetworkManager(1638)─┬─dhclient(3594)
                     ├─{NetworkManager}(1645)
                     ├─{NetworkManager}(1647)
                     └─{NetworkManager}(7363)

Думаю, это то, что вы искали.

используйте прямой pid или pgrep с именем процесса.

-p используется для печати pids дочерних элементов.

4
27.01.2020, 21:09

I would like to know what is the best way to determine the list of child processes that were spawned of this parent process.

Предполагая, что вы пишете в bash (, вы не говорите ). Затем вы можете использовать управление заданиями. Это отключено по умолчанию при запуске скриптов.

Руководство bash говорит:

set [--abefhkmnptuvxBCHP] [-o option] [arg...]
...
-m Monitor mode.
Job control is enabled. This option is on by default for interactive shells on systems that support it (see JOB CONTROL above). Background processes run in a separate process group and a line containing their exit status is printed upon their completion.

Итак, добавьте в свой сценарий set -m, чтобы вы могли запускать команды с помощью command &, а затем выполните jobsдля вывода списка заданий.

-2
27.01.2020, 21:09

Теги

Похожие вопросы