我有以下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
;如果没有,我只想退出。
但是,我不知道如何检查第一个作业是否存活,因此伪代码行。那么,应该采取什么措施呢?
答案 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
命令;它列出了所有正在运行的工作。