如何检查后台作业是否还活着? (bash)的

时间:2012-06-28 06:55:51

标签: bash shell process background jobs

我有以下bash脚本,我们可以将其称为script1.sh

#!/bin/bash

exec ./script2.sh &

sleep 5

if job1 is alive then #<--- this line is pseudo-code!
    exec ./script3.sh &
    wait
fi

可以看出,脚本执行script2.sh作为后台作业,然后等待5秒(因此script2.sh可以执行一些初始化操作)。如果初始化成功,script2.sh作业仍然有效,在这种情况下我也想同时启动script3.sh;如果没有,我只想退出。

但是,我不知道如何检查第一个作业是否存活,因此伪代码行。那么,应该采取什么措施呢?

6 个答案:

答案 0 :(得分:11)

您可以使用$!获取最近一次后台作业的PID。然后,您可以检查 ps 的退出状态,以确定该特定PID是否仍在进程列表中。例如:

sleep 30 &
if ps -p $! >&-; then
    wait $!
else
    jobs
fi

答案 1 :(得分:9)

您可以检查信号是否可交付

./script2 &
myPid=$!
sleep 5

if kill -0 "$myPid"; then
    script3 &
    wait
fi

答案 2 :(得分:5)

我不确定exec是否适用于后台,因为它将父进程的图像替换为子进程的图像,否则,如果我们假设你摆脱了exec,你需要类似的东西:

#!/bin/bash
./script2.sh&
pid1=$!

if kill -0 $pid1; then
  ./script3.sh&
  pid3=$!
  wait
fi

答案 3 :(得分:5)

要扩展fduff的答案,您可以使用jobs内置:

if jobs %%
    exec ./script3.sh &
    wait
fi

jobs %%打印最近一次后台进程的作业ID(“当前作业”),成功时返回0,如果没有这样的工作则返回1.

答案 4 :(得分:2)

将您的后台进程pid复制到var

./script2.sh &; pid=$!

然后检查此pid是否存在于/proc目录中

[[ -e /proc/$pid ]] && { your_code; }

或与ls

ls /proc/$pid 2>/dev/null && { your_code; }

答案 5 :(得分:0)

查看jobs命令;它列出了所有正在运行的工作。