16

我有以下 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并发启动;如果没有,我只想退出。

但是,我不知道如何检查第一个作业是否还活着,因此是伪代码行。那么,应该用什么来代替它呢?

4

6 回答 6

15

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

sleep 30 &
if ps -p $! >&-; then
    wait $!
else
    jobs
fi
于 2012-06-28T07:06:53.620 回答
12

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

./script2 &
myPid=$!
sleep 5

if kill -0 "$myPid"; then
    script3 &
    wait
fi
于 2012-06-28T07:05:00.293 回答
9

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

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

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

于 2012-11-30T17:25:39.663 回答
5

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

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

if kill -0 $pid1; then
  ./script3.sh&
  pid3=$!
  wait
fi
于 2012-06-28T07:03:31.890 回答
3

将后台进程 pid 复制到 var

./script2.sh &; pid=$!

然后检查这个pid是否存在于/procdir中

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

或与ls

ls /proc/$pid 2>/dev/null && { your_code; }
于 2020-05-26T07:00:03.327 回答
0

看一下jobs命令;它列出了所有正在运行的作业。

于 2012-06-28T07:06:45.263 回答