При выполнении задания оболочки в фоновом режиме оболочка отслеживает код выхода, который можно получить с помощью wait <PID>
.
Когда новое фоновое задание запускается, оно получает свой собственный новый PID, даже если предыдущие фоновые задания завершены, потому что код выхода фонового задания сохраняется и сохраняется как запись с индексом PID, пока не завершится родительская оболочка.
Сколько фоновых заданий можно запускать повторно, прежде чем выделенный счетчик PID переполнится и перезапишет ранее сохраненные коды выхода?
Поскольку сохраненные коды выхода не освобождаются даже wait <PID>
, похоже, это вызывает утечку памяти из постоянно растущего хранилища кодов выхода.
Есть ли команда или опция для освобождения сохраненного кода завершения фонового задания, если он больше не нужен?
Вот тестовый код, показывающий, что фоновые задания для каждого кода выхода PID сохраняются.
#!/usr/bin/env bash
typeset -a background_jobs
report() {
# wait get exit-code of background job 0
wait "${background_jobs[0]}"
printf 'Exit-code of background job 0 is: 0x%02X\n' $?
# wait get exit-code of background job 1
wait "${background_jobs[1]}"
printf 'Exit-code of background job 1 is: 0x%02X\n' $?
# exit-code of job 0 still not released
wait "${background_jobs[0]}"
printf 'Still stored exit-code of background job 0 is: 0x%02X\n' $?
# exit-code of job 1 still not released
wait "${background_jobs[1]}"
printf 'Still stored exit-code of background job 1 is: 0x%02X\n' $?
local -i job_pid
printf '\nPID Ret\n-------------\n'
for job_pid in "${background_jobs[@]}"; do
wait "$job_pid"
printf '% 8d 0x%02X\n' "$job_pid" "$?"
done
exit 0
}
trap report EXIT
for ((i = 0; i < 25; i++)); do
{
exit $((RANDOM & 16#7F))
} &
background_jobs+=($!)
done 2>/dev/null