Использование Awk:
awk -F'[:,]' '{gsub(/"/,""); printf "%s:%s\n", $(NF-4),$NF}' file
accord:67000
civic:40000
camry:40000
camry:2000
MKZ:20000
Если вы используете 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
, поэтому мы не видим дальнейшего отслеживания дочерних процессов. pgrep будет полезна. Используйте эти команды:
Распечатать PID каждого разветвленного процесса из процесса($pid
):
pgrep -P $pid
Для получения более подробной информации о каждом разветвленном процессе используйте эту команду:
ps -fp `pgrep -P $pid`
, где $pid
— идентификатор вашего процесса.
pstree -p `pgrep NetworkManager`
NetworkManager(1638)─┬─dhclient(3594)
├─{NetworkManager}(1645)
├─{NetworkManager}(1647)
└─{NetworkManager}(7363)
Думаю, это то, что вы искали.
используйте прямой pid или pgrep с именем процесса.
-p используется для печати pids дочерних элементов.
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
для вывода списка заданий.