依次运行一系列命令

依次运行一系列命令

我遇到过这样一种情况:我运行了两个命令(它们进入后台(nohup)),2 小时后回来,如果两个命令都已完成,则再运行两个命令(再次 nohup),2 小时后再回来并运行两个命令,依此类推..

我想知道我是否可以将它们排队,以便在前两个完成后,后两个自动开始,这样我就不需要每 2 小时检查一次?

所有这些都是独立的程序;它们是占用大量内存和 CPU 的模拟,所以我不希望任何时候同时运行两个以上的程序。

我使用类似的语法运行它们:

nohup mySimulator inputs1.txt
nohup mySimulator inputs2.txt
nohup mySimulator inputs3.txt [after the first two have completed, that is..]

答案1

编写如下的 shell 脚本:

nohup mySimulator inputs1.txt
nohup mySimulator inputs2.txt
while (ps -A | grep -v grep | grep mySimulator > /dev/null); do sleep 1; done
nohup mySimulator inputs3.txt

然后从 shell 运行它

它启动两个模拟器,然后等待直到进程列表中没有 mySimulator 后再继续。

(这是在 Mac 上运行的,因此根据您的操作系统,可能需要进行一些调整... ps -A 应该打印所有正在运行的进程的列表)

答案2

使用该wait命令,但不要使用nohup。

command1 &
command2 &
wait        # this waits for command1 and command2
command3 &
command4 &

man bash

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

答案3

您可以使用 bash&&运算符。它类似于管道|运算符,只不过它不会将输出通过管道传输到下一个命令。相反,它会将它们链接在一起,这样只要其中一个命令没有遇到错误,执行就会继续。

例如:

echo "Test" && echo "Test done." && echo "Test2" && echo "Test2 done."

这将在脚本错误或任何返回 的脚本时停止false。例如:

echo "Test" && echo "Test done." && echo "Test2" && echo "Test2 done." && false && echo "This will never trigger."

相关内容