PID的等待和回收

chi*_*anc 3 shell process background-process

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

a () {
  sleep $1
}

a 10 &
PIDs="$PIDs $!"
a 50000 &
PIDs="$PIDs $!"

wait $PIDs   
Run Code Online (Sandbox Code Playgroud)

问题是第一个函数调用需要 10 秒(睡眠 10),但第二个需要将近 14 小时(睡眠 50000)。

我担心第一次调用的 PID 将被回收,14 小时后,当第二次调用终止时,该 PID 正在被另一个进程使用,并将阻止脚本继续。还是等待调用完成后立即从列表中删除第一个 PID,只是简单地等待第二个进程完成而不是等待它们两个都在最后完成?

Jef*_*ler 6

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
Run Code Online (Sandbox Code Playgroud)