Используйте wait
для правильных номеров pid.
function_child() {
while read -r record; do
# let's return a random number!
exit ${RANDOM}
done <<<'a'
}
mkdir -p my-home/dir
touch my-home/dir/{1..9}
for file in my-home/dir/*; do
function_child "$file" &
pid=$!
echo "Backgrounded: $file (pid=$pid)"
pids[$pid]=$file
done
for i in "${!pids[@]}"; do
wait "$i"
ret=$?
echo ${pids[$i]} returned with $ret
done
выходы на repl :
Backgrounded: my-home/dir/1 (pid=84)
Backgrounded: my-home/dir/2 (pid=85)
Backgrounded: my-home/dir/3 (pid=86)
Backgrounded: my-home/dir/4 (pid=87)
Backgrounded: my-home/dir/5 (pid=88)
Backgrounded: my-home/dir/6 (pid=89)
Backgrounded: my-home/dir/7 (pid=90)
Backgrounded: my-home/dir/8 (pid=91)
Backgrounded: my-home/dir/9 (pid=92)
my-home/dir/1 returned with 241
my-home/dir/2 returned with 59
my-home/dir/3 returned with 235
my-home/dir/4 returned with 11
my-home/dir/5 returned with 6
my-home/dir/6 returned with 222
my-home/dir/7 returned with 230
my-home/dir/8 returned with 189
my-home/dir/9 returned with 195
Но я думаю, что просто используйте xargs
или другое инструмент, предназначенный для параллельного запуска таких заданий.
printf "%s\n" my-home/dir/* | xargs -n$'\n' -P8 sh -c 'echo "$1"; ###process to get the data by arsdoc get' --
@ KamilCuk, appologies, обновил код.
PID_LIST+="$PID "
создает одну длинную переменную с пробелами , "${PID_LIST[@]}"
- это расширение, используемое для массивов. Это работает так, что ${PID_LIST[@]}
просто расширяется до значения переменной PID_LIST
, как если бы "$PID_LIST"
, поэтому он расширяется до "23043 23049 "
. Поскольку он находится в кавычках, он выполняет итерации по одному элементу, следовательно, он запускается wait "23043 23049 "
, поэтому вы видите сообщение об ошибке.
Не рекомендуется: вы можете зависеть от разбиения пространства оболочки
for process in $PID_LIST; do
wait "$process"
Но просто используйте массив:
PID_LIST+=("$PID")
done
for process in "${PID_LIST[@]}"; do
wait "$process"
Если вы чувствуете себя небезопасно с вашим ассоциативным массивом pids[$pid]=$file
, используйте вместо него два массива:
onlypids+=("$pid")
files+=("$files")
done
for i in "${!onlypids[@]}"; do
pid="${onlypids[$i]}"
file="${files[$i]}"
wait "$pid"
Обратите внимание, что условно переменная верхнего регистра имена для экспортируемых переменных.