PID的等待和回收

PID的等待和回收

我担心在脚本中,我将调用函数的并行版本在后台运行,然后发出等待。

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

这可以在没有任何停机或其他中断的情况下完成。

相关内容