我想在链中启动程序,比如启动bash脚本startScript.sh然后在startScript.sh链中加载某些程序。
startScript.sh
./program1 &
#PID=(echo $!)
PID=$!
echo "Wait for 10 seconds here"
if ps -p $PID > /dev/null; then echo "continue"; ./program2; else echo "PID is not running"; exit; fi
echo "Wait for 10 seconds here"
#if program1 is running and program2 is running, then ./program3, else exit.
我试图用$!找到program1的运行pid,但问题是program1本身就是一个shell脚本,它们会调用我不感兴趣的更多shell脚本。因此$!永远不会给我./program1的pid但是无关紧要的东西。我可以获得program1的PID吗?
另外,如何获取program1和program2的PID以查看它们是否正在运行,然后启动program3。
答案 0 :(得分:1)
shell中的特殊参数$!
(来自man bash
):
扩展到最近放入后台的作业的进程ID ,无论是作为异步命令执行还是使用bg内置(请参阅下面的JOB CONTROL)。
重要的是要注意作业控制是shell本地的(在您的情况下,执行bash
的{{1}}解释器是本地的。)
这意味着下面的startScript.sh
:
pid
将始终包含#!/bin/bash
./program.sh
pid=$!
脚本的PID(即执行它的进程,使用hashbang定义,在您的情况下可能是另一个program.sh
进程),无论该子进程生成的后台进程如何进程(请记住bash
对于您的脚本是本地的;子进程中的$!
将是未定义的,直到在那里生成后台进程。)
最初可能偏离你的是:
$!
没有正确设置PID。 PID=(echo $!)
设置为包含两个单词(元素)的数组:PID
和echo
。你想要这个:
<pid>
(也许使用小写名称作为非全局变量pid=$!
)。
一个简单的演示:
pid
注意$ cat script1.sh
#!/bin/bash
./script2.sh &
echo "in script1: $!"
$ cat script2.sh
#!/bin/bash
echo "in script2: $!"
sleep 5 &
echo "in script2 after sleep: $!"
$ ./script1.sh
in script1: 19537
in script2:
in script2 after sleep: 19541
中$!
最初未定义的情况 - 如果script2.sh
是全局返回最后一个PID ,它将被设置为{的{ {1}}。