it-swarm.cn

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

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

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

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

55
skd

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

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

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

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

应该做的伎俩。这比pgrep和进程名称稍微稳定一些。

56
thiton

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

fg; echo "first job finished"
27
Yangchuan Li

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

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

20
ks1322

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

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

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

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

2
shivams

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

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

致电SCRIPT_2

0
PonnuKumar Ramalingam

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

Nohup bash script1.sh&

等待

Nohup bash script2.sh&

0
Servando Flores