所以我有一个进程正在运行,需要几个小时才能完成。我希望自动完成另一个过程。请注意,我无法在第一个脚本中添加对第二个脚本的调用,也不会创建另一个顺序运行它们的脚本。在Linux中有没有办法做到这一点?
编辑:一个选项是使用pgrep每隔x
分钟轮询一次并检查该过程是否完成。如果是,请启动另一个。但是,我不喜欢这个解决方案。
PS:两者都是bash脚本,如果有帮助的话。
答案 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。