所以我有一个进程正在运行,需要几个小时才能完成。我想在一个进程完成后立即自动启动另一个进程。请注意,我无法在第一个脚本中添加对第二个脚本的调用,也无法创建另一个按顺序运行这两个脚本的脚本。在Linux下有什么办法可以做到这一点吗?
编辑:一种选择是使用 pgrep 每
x
分钟轮询一次并检查该过程是否完成。如果是这样,请启动另一项。但是,我不喜欢这个解决方案。
PS:两者都是 bash 脚本,如果有帮助的话。
给定第一个进程的PID,循环
while ps -p $PID; do sleep 1; done ; script2
应该可以解决问题。这比 pgrep 和进程名称更稳定一点。
也许你可以先按ctrl+z然后输入
fg; echo "first job finished"
轮询可能是可行的方法,但它不一定是可怕的。
pid=$(ps -opid= -C your_script_name)
while [ -d /proc/$pid ] ; do
sleep 1
done && ./your_other_script
您可以使用 bash 内置命令
wait
已经运行的进程 wait
。 男人狂欢。
wait [n ...] 等待每个指定的进程并返回其 终止状态。每个n可以是进程ID或作业规范; 如果给出了作业规范,则该作业管道中的所有进程都是 等待。如果未给出 n,则所有当前活动的子进程 正在等待,返回状态为零。如果 n 指定 不存在的进程或作业,返回状态为127。否则, 返回状态是最后等待的进程或作业的退出状态 为.
经常发生这样的情况:你的程序正在运行多个恶魔。在这种情况下,你的 pid 将是一个数组。只需使用:
PID=($(pidof -x process_name)) #这将给定进程的所有PID保存在$pid数组中
现在,只需将 thiton 的代码修改为:
while ps -p ${PID[*]}; do sleep 1; done ; script2
我也遇到了类似的问题,是这样解决的:
nohup bash script1.sh &
等等
nohup bash script2.sh &
我有同样的需求并通过以下方式解决:
while [[ "$exp" != 0 ]]; do
exp=$(ps -ef |grep -i "SCRIPT_1" |grep -v grep |wc -l)
sleep 5;
done
调用 SCRIPT_2
watch -g ps -opid -p ;命令
您可以使用此命令在进程完成后运行特定命令。该进程通过其 PID 进行识别。
最简单的方法:
./script1.sh && ./script2.sh
&& 表示等待 script1 成功完成,然后再继续执行 script2。