我遇到过这样一种情况:我运行了两个命令(它们进入后台(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."