Как найти количество дочерних процессов bash script из самого script?
Поиск количества дочерних процессов
Ответ 1
Чтобы получить PID bash script, вы можете использовать переменную $$
.
Затем, чтобы получить своих детей, вы можете запустить:
bash_pid=$$
children=`ps -eo ppid | grep -w $bash_pid`
ps
вернет список родительских PID. Затем grep
фильтрует все процессы, не связанные с детьми bash script. Чтобы получить количество детей, вы можете сделать:
num_children=`echo $children | wc -w`
Фактически число, которое вы получите, будет отключено на 1, так как ps
будет дочерним элементом bash script. Если вы не хотите считать выполнение ps
в качестве дочернего элемента, вы можете просто исправить это с помощью:
let num_children=num_children-1
UPDATE: Чтобы избежать вызова grep
, может использоваться следующий синтаксис (если поддерживается установленной версией ps
):
num_children=`ps --no-headers -o pid --ppid=$$ | wc -w`
Ответ 2
Я предпочитаю:
num_children=$(pgrep -c -P$$)
Он генерирует только один процесс, вам не нужно подсчитывать слова или настраивать номера PID программами в канале.
Пример:
~ $ echo $(pgrep -c -P$$)
0
~ $ sleep 20 &
[1] 26114
~ $ echo $(pgrep -c -P$$)
1
Ответ 3
Вы также можете использовать pgrep:
child_count=$(($(pgrep --parent $$ | wc -l) - 1))
Используйте pgrep --parent $$
, чтобы получить список дочерних элементов процесса bash.
Затем используйте wc -l
на выходе, чтобы получить количество строк: $(pgrep --parent $$ | wc -l)
Затем вычитайте 1 (wc -l
сообщает 1, даже когда pgrep --parent $$
пуст)
Ответ 4
Используйте ps
с опцией --ppid
для выбора дочерних элементов текущего процесса bash.
bash_pid=$$
child_count=$(ps -o pid= --ppid $bash_id | wc -l)
let child_count-=1 # If you don't want to count the subshell that computed the answer
(Примечание: для этого требуется версия Linux ps
для --ppid
. Я не знаю, есть ли эквивалент для BSD ps
или нет.)
Ответ 5
Если количество заданий (вместо числа pid) достаточно, я просто пришел с версией только для bash:
job_list=($(jobs -p))
job_count=${#job_list[@]}
Ответ 6
Вы можете оценить командные задания командной строки, такие как:
counter = `jobs | wc -l`