Здесь происходит немного больше. По сути, вы на правильном пути, wait
может собирать и сообщать о статусе возвращения ребенка, например:
for i in {0..20}; do
if [[ $((i % 2)) -eq 1 ]]; then
/bin/true &
else
/bin/false &
fi
a[${i}]=$!
done
for i in ${a[@]}; do
wait ${i}; echo "PID(${i}) returned: $?"
done
Почему вы не видите то же самое?
Ну, для начала, process
- это (на самом деле) не процесс, а функция (следовательно, как уже упоминалось в комментарии, exit
не является правильным способом его завершения, если он вызывается в сценарии, он завершает весь сценарий, а не просто функция). Это действительно процесс, но как часть этого. Shell создаст новую подоболочку и запустит вашу функцию (следовательно, выход не смертелен для внешнего скрипта). Статус, в котором находилась ваша оболочка в момент ее появления, очень важен.
Вы также сравниваете с ${PID}
, который на самом деле является PID
последней подоболочки, и для первого вызова выдает ошибку. Вы, вероятно, хотели поискать $$
, за исключением того, что приведенный выше абзац будет означать, что все функции (вложенные оболочки) будут использовать одно и то же значение (родительского процесса).
Оснащен этой информацией, минимальный изменение в вашем сценарии - использовать $$
в функции process
, экспортировать функцию, чтобы мы могли использовать ее в новом экземпляре оболочки, мы fork
, мы отслеживаем PID
этой новой оболочки:
process()
{
rem=$(( $$ % 2 ))
...
}
export -f process
for i in {1..100}; do
bash -c "process" $i &
...