Как найти количество дочерних процессов скрипта bash внутри самого скрипта?
Нахождение количества дочерних процессов
Ответы (6)
Чтобы получить PID сценария bash, вы можете использовать переменную $$
.
Затем, чтобы получить его дочерние элементы, вы можете запустить:
bash_pid=$$
children=`ps -eo ppid | grep -w $bash_pid`
ps
вернет список родительских PID. Затем grep
фильтрует все процессы, не связанные с дочерними элементами bash-скрипта. Для того, чтобы получить количество детей, вы можете сделать:
num_children=`echo $children | wc -w`
На самом деле число, которое вы получите, будет на 1 меньше, так как ps
также будет дочерним элементом сценария bash. Если вы не хотите считать выполнение ps
дочерним, вы можете просто исправить это с помощью:
let num_children=num_children-1
ОБНОВЛЕНИЕ: во избежание вызова grep
может использоваться следующий синтаксис (если он поддерживается установленной версией ps
):
num_children=`ps --no-headers -o pid --ppid=$$ | wc -w`
grep -w $bash_pid
в случае, если pid bash является подстрокой идентификатора дочернего процесса.
- person chepner; 18.07.2012
grep
: ps -o ppid= -p $$
(по крайней мере, с GNU ps
).
- person Dennis Williamson; 18.07.2012
foo=$(sleep 10 | wc -l)
. Затем я проверил с помощью ps
, и оба sleep
и wc
были указаны как прямые дочерние элементы сценария (т.е. между ними не было новой оболочки).
- person betabandido; 18.07.2012
Я предпочитаю:
num_children=$(pgrep -c -P$$)
Он порождает только один процесс, вам не нужно считать слова или настраивать номера PID программами в канале.
Пример:
~ $ echo $(pgrep -c -P$$)
0
~ $ sleep 20 &
[1] 26114
~ $ echo $(pgrep -c -P$$)
1
Вы также можете использовать pgrep:
child_count=$(($(pgrep --parent $$ | wc -l) - 1))
Используйте pgrep --parent $$
, чтобы получить список дочерних элементов процесса bash.
Затем используйте wc -l
на выходе, чтобы получить количество строк: $(pgrep --parent $$ | wc -l)
Затем вычтите 1 (wc -l
сообщает 1, даже если pgrep --parent $$
пусто)
Используйте 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
или нет.)
ps: illegal option -- -
. Возможно, вы предполагаете конкретную версию ps?
- person ghoti; 18.07.2012
Если количества заданий (вместо количества pid) достаточно, я только что пришел с версией только для bash:
job_list=($(jobs -p))
job_count=${#job_list[@]}
Вы можете оценить встроенные командные задания оболочки, например:
counter = `jobs | wc -l`
$()
вместо обратных кавычек.
- person Dennis Williamson; 18.07.2012