gpt4 book ai didi

bash - 为什么 bash "forget"关于我的后台进程?

转载 作者:行者123 更新时间:2023-12-05 09:25:42 25 4
gpt4 key购买 nike

我有这个代码:

#!/bin/bash
pids=()
for i in $(seq 1 999); do
sleep 1 &
pids+=( "$!" )
done
for pid in "${pids[@]}"; do
wait "$pid"
done

我期望以下行为:

  • 旋转第一个循环
  • 在第一个 pid 上等待大约一秒钟
  • 旋转第二个循环

相反,我收到此错误:

./foo.sh: line 8: wait: pid 24752 is not a child of this shell

(用不同的 pid 重复 171 次)

如果我以更短的循环(50 而不是 999)运行脚本,那么我不会出错。

这是怎么回事?

编辑:我在 Windows 上使用 GNU bash 4.4.23。

最佳答案

POSIX says :

The implementation need not retain more than the {CHILD_MAX} most recent entries in its list of known process IDs in the current shell execution environment.

{CHILD_MAX} 这里指的是每个用户允许的最大并发进程数。您可以使用 getconf 实用程序获取此限制的值:

$ getconf CHILD_MAX
13195

Bash 在 circular buffer 中最多存储两倍于已退出后台进程的状态。 ,并在您对已被覆盖的旧 shell 的 PID 调用 wait 时说not a child of this shell。你可以看到它是如何实现的 here .

关于bash - 为什么 bash "forget"关于我的后台进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75357592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com