получить pid нескольких экземпляров процесса в сценарии и использовать их

Да, все будет хорошо. В худшем случае размер файла с исключаемыми строками равен размеру обрабатываемого файла и не помещается в память. Если у вас есть такой случай, разделите файл исключения на куски и запустите несколько проходов.

0
15.09.2019, 17:12
2 ответа

Сохраняйте PID при запуске процессов:

pids=()

./w1 & pids+=( "$!" )
./w1 & pids+=( "$!" )
./w1 & pids+=( "$!" )
./w1 & pids+=( "$!" )

(предполагается оболочка сbash-совместимым синтаксисом массива)

Теперь у вас есть PID в массиве pidsи вы можете получить к ним доступ как "${pids[0]}", "${pids[1]}"и т. д.

Если вы используете обычный/bin/sh:

set --

./w1 & set -- "$@" "$!"
./w1 & set -- "$@" "$!"
./w1 & set -- "$@" "$!"
./w1 & set -- "$@" "$!"

Теперь у вас есть PID в списке "$@"и вы можете получить к ним доступ как "$1", "$2"и т. д.

Специальное значение "$!"будет PID последней запущенной фоновой команды.

2
28.01.2020, 02:29

Если вы используете bash, вы можете использовать jobs -l, в котором перечислены фоновые задания вместе с их PID. Например, в следующем примере все PID заданий, соответствующих ./w1, будут храниться в массивеpids:

pids=( $(jobs -l | awk '/\.\/w1/ {print $2}') )

В других оболочках вы можете использовать ps --ppid $$для вывода списка всех заданий с текущей оболочкой в ​​качестве родительской:

pids=( $(ps --ppid $$ -o pid,cmd -h | awk '/\.\/w1/ {print $1}') )

ПРИМЕЧАНИЕ. :Насколько я знаю, это не переносимое -, оно будет работать только с psиз пакета Linux procps. Другие версии psне имеют таких параметров.

Во FreeBSD psвы можете сделать нечто подобное (в bash или ksh или какой-либо другой оболочке, поддерживающей массивы):

pids=( $(ps -j | awk -v ppid=$$ '$3==ppid && /\.\/w1/ {print $2}') )

Если у вас есть pgrep, вы можете использовать:

pids=( $(pgrep -P $$ w1) )

Во всех вариантах я проверяю соответствие фонового процесса./w1-Если вы уверены, что никогда не будет запущено никаких других дочерних или фоновых процессов этого PPID, вы можете пропустить этот тест в awkскрипты (и нужно только вывести -o pidво втором варианте команды ps).

0
28.01.2020, 02:29

Теги

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