当在后台运行 shell 作业时,shell 会跟踪可以使用 检索的退出代码wait <PID>
。
当运行新的后台作业时,它会获得自己的新 PID,即使先前的后台作业已结束,因为后台作业的退出代码被存储并保留为 PID 索引条目,直到父 shell 结束。
在分配的 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