shell 的最大后台作业 PID 存储的退出代码是多少?

shell 的最大后台作业 PID 存储的退出代码是多少?

当在后台运行 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

相关内容