我担心在脚本中,我将调用函数的并行版本在后台运行,然后发出等待。
a () {
sleep $1
}
a 10 &
PIDs="$PIDs $!"
a 50000 &
PIDs="$PIDs $!"
wait $PIDs
问题是第一个函数调用需要 10 秒(sleep 10),但第二个函数调用需要近 14 小时(sleep 50000)。
我担心第一次调用的 PID 将被重新循环,14 小时后,当第二次调用终止时,该 PID 正被另一个进程使用,并将阻止脚本继续运行。或者 wait 是否会在调用完成后立即从列表中删除第一个 PID,而只是简单地等待第二个进程完成,而不是等待它们最后都完成?
答案1
亲眼看看wait
内置函数不会等待随机进程——只等待当前 shell 的子进程。
#!/bin/bash
sleep 2 &
P=$!
echo sleeping 3 seconds...
sleep 3
echo waiting for $P ...
wait $P
R=$RANDOM
echo waiting for $R ...
wait $R
echo done
$ ./t.sh
sleeping 3 seconds...
waiting for 93208... ## this returns immediately, since that PID is gone
waiting for 31941 ...
./t.sh: line 10: wait: pid 31941 is not a child of this shell
done
答案2
我假设你运行的是Linux。鉴于:
您可以kernel.pid_max
增加/etc/sysctl.conf
.默认值为 32768,如果其中未明确定义,则适用。添加如下内容:
kernel.pid.max = 4000000
加载修改后的sysctl.conf
内容:
# sysctl -p
这可以在没有任何停机或其他中断的情况下完成。