unix wait命令用于轮询

时间:2014-06-12 08:37:52

标签: bash shell unix ksh

在我工作的地方,我在shell脚本中看到了以下片段,以检查后台作业的完成情况:

until [[ `ps -ef | grep backgroundjob | grep -v grep | wc -l` -eq 0 ]];
do
  sleep 30
done

在阅读了wait命令的手册页后,我知道这3行可以用更简短易读的方式替换为wait命令。我的问题是:

  1. 是否存在wait命令可能存在的任何缺点或情况 不能像上面的片段一样工作?

  2. 如何执行wait命令?它似乎几乎回归 马上,所以可能是一个     紧环?如果它是一个紧凑的循环,那么可能是上面的代码片段     在等待命令的情况下,CPU休眠30秒会很容易吗?

1 个答案:

答案 0 :(得分:2)

wait仅适用于当前shell的子进程。这意味着,如果您的进程分支到后台本身,原始子进程将退出,并且shell无法wait就可以了。

有些贝壳'如果没有这样的子进程,wait内置将立即返回;其他人,如bash,会警告你:

$ wait 1234
bash: wait: pid 1234 is not a child of this shell

wait不会施加任何CPU负载,因为它使用waitpid(2)系统调用,暂停进程直到指定进程退出。