情况: 我可以访问3个远程服务器。一项工作需要一天或更长时间才能在服务器中完成。我希望在早期工作完成后自动启动另一个工作。我不是这些远程机器的管理员。
有没有办法知道作业何时完成(或者当cpu负载降低到阈值以下)然后运行下一个作业(可能在特定目录中运行某个shell脚本)?
最终,类似于PBS或SLURM的系统(不那么强大的想法)。
可行吗?
答案 0 :(得分:2)
使用大多数unix / linux上广泛使用的batch
命令
来自手册页
batch executes commands when system load levels permit; in other
words, when the load average drops below 0.8, or the value
specified in the invocation of atd.
设置负载平均值达到新批量执行开始时将-l选项传递给atd的级别。从手册页
OPTIONS -l指定批处理作业应该的限制加载因子 不能运行,而不是1.5的编译时选择。为 有n个CPU的SMP系统,你可能想要设置它 高于n-1。
因此,如果负载平均值为3.5,那么在具有4 cpu的系统上运行足够的东西以保持3个半cpus忙。
如果您的作业一次可以使用2个cpu,那么您可能希望在4个cpu系统上将-l设置为1.9
答案 1 :(得分:1)
一种选择是使用GNU Parallel。它可以安排工作(limiting the number of simultaneous jobs)on remote machines through SSH,甚至handles transfer of input data and output results。
假设您的软件名为a.out
,并且需要从1扫描到10的参数,您可以运行如下命令:
parallel -S server1,server2,server3 -j3 ./a.out ::: {1..10}
然后,自动将任务分派到三台服务器,当前一台服务器完成后,自动分配下一台服务器。