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

问题描述 投票:0回答:9

所以我有一个进程正在运行,需要几个小时才能完成。我想在一个进程完成后立即自动启动另一个进程。请注意,我无法在第一个脚本中添加对第二个脚本的调用,也无法创建另一个按顺序运行这两个脚本的脚本。在Linux下有什么办法可以做到这一点吗?

编辑:一种选择是使用 pgrep 每

x
分钟轮询一次并检查该过程是否完成。如果是这样,请启动另一项。但是,我不喜欢这个解决方案。

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

linux bash process
9个回答
67
投票

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

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

应该可以解决问题。这比 pgrep 和进程名称更稳定一点。


60
投票

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

fg; echo "first job finished"

34
投票

轮询可能是可行的方法,但它不一定是可怕的。

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

23
投票

您可以使用 bash 内置命令

wait
已经运行的进程
wait
男人狂欢

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


2
投票

经常发生这样的情况:你的程序正在运行多个恶魔。在这种情况下,你的 pid 将是一个数组。只需使用:

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

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

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


0
投票

我也遇到了类似的问题,是这样解决的:

nohup bash script1.sh &

等等

nohup bash script2.sh &


0
投票

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

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

调用 SCRIPT_2


0
投票

watch -g ps -opid -p ;命令

您可以使用此命令在进程完成后运行特定命令。该进程通过其 PID 进行识别。


-2
投票

最简单的方法:

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

&& 表示等待 script1 成功完成,然后再继续执行 script2。

© www.soinside.com 2019 - 2024. All rights reserved.