Подтвердить что ты не робот

Поиск количества дочерних процессов

Как найти количество дочерних процессов bash script из самого script?

4b9b3361

Ответ 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`