我有一系列需要完成的工作;作业之间没有依赖关系。我正在寻找一种可以帮助我将这些工作分配给机器的工具。唯一的限制是每台机器应该一次只运行一个作业。我正在努力最大化吞吐量,因为工作不是很平衡。我当前被攻击的shell脚本效率不高,因为我预先构建了每台计算机的作业队列,并且无法将重载机器的队列中的作业移动到等待已经完成所有操作的机器上。
以前的建议已经包含了SLURM,这看起来有点矫枉过正,甚至更多的是过度使用LoadLeveller。
GNU Parallel看起来几乎就是我想要的,但远程机器不会说SSH;有一个自定义作业启动器(没有排队功能)。我想要的是Gnu Parallel,在调度作业之前,机器可以直接替换成shell脚本。
所以,总结一下:
最糟糕的情况可能会与bash的lockfile一起被攻击,但我觉得好像某个地方必须存在更好的解决方案。
答案 0 :(得分:2)
假设您的作业位于文本文件jobs.tab
中,似乎
/path/to/job1
/path/to/job2
...
像{/ p>一样创建dispatcher.sh
mkfifo /tmp/jobs.fifo
while true; do
read JOB
if test -z "$JOB"; then
break
fi
echo -n "Dispatching job $JOB .."
echo $JOB >> /tmp/jobs.fifo
echo ".. taken!"
done
rm /tmp/jobs.fifo
并运行
的一个实例dispatcher.sh < jobs.tab
现在创建launcher.sh
为
while true; do
read JOB < /tmp/jobs.fifo
if test -z "$JOB"; then
break
fi
#launch job $JOB on machine $0 from your custom launcher
done
并为每台目标计算机运行一个launcher.sh
实例(将该计算机作为第一个也是唯一的参数)
答案 1 :(得分:1)
GNU Parallel支持您自己的ssh命令。所以这应该有效:
function my_submit { echo On host $1 run command $3; }
export -f my_submit
parallel -j1 -S "my_submit server1,my_submit server2" my_command ::: arg1 arg2