在另一个(已经运行)完成之后启动脚本

时间:2011-09-20 13:16:47

标签: linux bash process

所以我有一个进程正在运行,需要几个小时才能完成。我希望自动完成另一个过程。请注意,我无法在第一个脚本中添加对第二个脚本的调用,也不会创建另一个顺序运行它们的脚本。在Linux中有没有办法做到这一点?

编辑:一个选项是使用pgrep每隔x分钟轮询一次并检查该过程是否完成。如果是,请启动另一个。但是,我不喜欢这个解决方案。

PS:两者都是bash脚本,如果有帮助的话。

8 个答案:

答案 0 :(得分:56)

给定第一个进程的PID,循环

while ps -p $PID; do sleep 1; done ; script2

应该做的伎俩。这比pgrep和进程名称更稳定。

答案 1 :(得分:30)

轮询可能是要走的路,但它并不一定非常糟糕。

pid=$(ps -opid= -C your_script_name)
while [ -d /proc/$pid ] ; do
    sleep 1
done && ./your_other_script

答案 2 :(得分:27)

也许您可以先按ctrl + z然后输入

fg; echo "first job finished"

答案 3 :(得分:20)

您可以使用bash内置命令wait wait已在运行进程。 man bash

  

wait [n ...]等待每个指定的进程并返回它   终止状态。每个n可以是进程ID或作业规范;   如果给出了工作规范,那么该工作的管道中的所有进程都是   等待。如果没有给出n,则所有当前活动的子进程   等待,返回状态为零。如果n指定a   不存在的进程或作业,返回状态为127.否则,   返回状态是最后一个进程或作业等待的退出状态   对

答案 4 :(得分:2)

通常情况下,你的程序运行了几个恶魔。在这种情况下,你的pid将是一个数组。只需使用:

  

PID =($(pidof -x process_name)) #this保存$ pid数组中给定进程的所有PID

现在,只需将thiton的代码修改为:

while ps -p ${PID[*]}; do sleep 1; done ; script2

答案 5 :(得分:0)

我遇到了类似的问题并以这种方式解决了这个问题:

nohup bash script1.sh&

等待

nohup bash script2.sh&

答案 6 :(得分:0)

我有同样的要求,并通过以下方式解决:

while [[ "$exp" != 0 ]]; do
exp=$(ps -ef |grep -i "SCRIPT_1" |grep -v grep |wc -l)
sleep 5;
done

致电SCRIPT_2

答案 7 :(得分:-1)

最简单的方法:

./script1.sh && ./script2.sh

&& 表示在继续执行script2之前等待成功完成script1。