bash中

时间:2017-10-26 12:53:40

标签: bash shell

我想在链中启动程序,比如启动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。

1 个答案:

答案 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 $!) 设置为包含两个单词(元素)的数组:PIDecho。你想要这个:

<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}}。