Bash wait 命令

537 阅读1分钟

wait

指定 jobspec 或者进程 ID

wait [options] ID

ID 表示进程或者 job 的 id,若没有提供该参数,wait 将等待所有的后台任务完成。并且返回最后一个命令的状态(exit status)。

  • 进程 ID 比如:
wait 7654

等待进程 7654 退出。如果制定多个 process ID,那么 wait 将等待所有进程退出。

  • jobspec

什么是 jobspec?可以使用 jobspec 来指定正在运行的某个 Job。jobspec 以百分号开始。

比如:

rsync -a /home /tmp/home &

shell 将输出如下: [2] 54377

此时可以使用如下方式等待该任务完成。

wait %2

-n

  • 使用 -n 加上 pids 使用 -n 选项,将等待指定的 job 中的,任意一条 job 退出,并且返回其退出的 staus code(谁最先就返回谁)。
wait -n 45432 54346 76573
  • 使用 -n 不加任何选项 等待任意的后台 job 退出,并且返回其 exit status(第一个退出该阻塞就停止)。

-p 选项

当我们使用 -n 时,存在一个问题就是不知道退出的是哪一个进程。它只返回了job 的 exit status。 所以这个时候就可以接触 -p 选项。

wait -p job_id -n 45432 54346 76573

示例

  • wait 知道 process id
#!/bin/bash
sleep 30 &
process_id=$!
echo "PID: $process_id"
wait $process_id
echo "Exit status: $?"
  • wait 添加 -n 和不加任何选项
#!/bin/bash
sleep 3 &
sleep 30 &
sleep 5 &
wait -n
echo "First job completed."
wait
echo "All jobs completed."

该脚本执行时,会在后台生成三个进程,wait -n等待第一个进程结束,wait 等待所有的后台任务完成。