Команда Bash `wait`, ожидающая более 1 PID для завершения выполнения
Я недавно опубликовал вопрос, спрашивающий, возможно липредотвратить повторное использование PID.
Пока что ответ, похоже, нет. (Что хорошо.)
Тем не менее, пользовательДиего Торрес Милано добавил ответ на этот вопрос, и мой вопрос здесь касается этого ответа.
Диего ответил:
Если вы боитесь повторно использовать PID, чего не произойдет, если вы будете ждать, как объясняют другие ответы, вы можете использовать
echo 4194303 > /proc/sys/kernel/pid_max
уменьшить свой страх ;-)
Я на самом деле не понимаю, почему Диего использовал номер4194303
здесь, но это другой вопрос.
Насколько я понимаю, у меня была проблема со следующим кодом:
for pid in "${PIDS[@]}"
do
wait $pid
done
Проблема в том, что у меня есть несколько PID в массиве, и что цикл for будет запускатьwait
Команда последовательно с каждым PID в массиве, однако я не могу предсказать, что процессы будут завершены в том же порядке, в котором их PID хранятся в этом массиве.
то есть; следующиемог бывает:
Начать ожидание PID в индексе массива 0Процесс с PID в индексе 1 массива завершаетсяВ системе выполняются новые задания, в результате чего PID, который сохраняется в индексе 1 массива PID, являетсяповторно используется для другого процессаwait
заканчивается как PID в выходах индекса массива 0Начать ожидание PID в индексе массива 0,кроме того, что теперь это другой процесс, и мы понятия не имеем, что это такоеПроцесс, который был запущен, который повторно использовал PID, которыйwait
в настоящее время ждетникогда завершается. Возможно, это PID почтового сервера или что-то, что запустил системный администратор.wait
продолжает ждать, пока не будет найдена следующая серьезная ошибка linux и система не будет перезагружена или не произойдет сбой питанияДиего сказал:
что не произойдет, если вы будете ждать, пока другие ответы
то есть; что ситуация, которую я описал выше, не может произойти.
Диего прав?
Если так, то почему ситуация, о которой я говорил выше, не может возникнуть?Или Диего не прав?
Если так, тогда я выложу новый вопрос позже сегодня ...Дополнительные примечанияМне пришло в голову, что этот вопрос может сбивать с толку, если вы не знаете, что PID являются PID процессов, запущенных в фоновом режиме. то есть;
my_function &
PID="$!"
PIDS+=($PID)