Да, все будет хорошо. В худшем случае размер файла с исключаемыми строками равен размеру обрабатываемого файла и не помещается в память. Если у вас есть такой случай, разделите файл исключения на куски и запустите несколько проходов.
Сохраняйте 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 последней запущенной фоновой команды.
Если вы используете 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
).