我想使用批次将工作从主服务器分发到多个工作服务器。
理想情况下,我会有一个tasks.txt
文件,其中包含要执行的任务列表
cmd args 1
cmd args 2
cmd args 3
cmd args 4
cmd args 5
cmd args 6
cmd args 7
...
cmd args n
并且每个工作服务器将使用ssh进行连接,读取文件并将每一行标记为正在进行或已完成
#cmd args 1 #worker1 - done
#cmd args 2 #worker2 - in progress
#cmd args 3 #worker3 - in progress
#cmd args 4 #worker1 - in progress
cmd args 5
cmd args 6
cmd args 7
...
cmd args n
我知道如何建立ssh连接,读取文件,远程执行但不知道如何进行读写原子操作,以免出现2台服务器启动相同任务的情况,以及如何更新该行。
我希望每个工作人员都能进入任务列表并锁定列表中的下一个可用任务,而不是服务器主动命令工作人员,因为我将有一个灵活的工人克隆数量,我将开始或关闭根据我需要多快完成任务。
更新:
我的工作脚本的意思是:
#!/bin/bash
taskCmd=""
taskLine=0
masterSSH="ssh usr@masterhost"
tasksFile="/path/to/tasks.txt"
function getTask(){
while [[ $taskCmd == "" ]]
do
sleep 1;
taskCmd_and_taskLine=$($masterSSH "#read_and_lock_next_available_line $tasksFile;")
taskCmd=${taskCmd_and_taskLine[0]}
taskLine=${taskCmd_and_taskLine[1]}
done
}
function updateTask(){
message=$1
$masterSSH "#update_currentTask $tasksFile $taskLine $message;"
}
function doTask(){
return $taskCmd;
}
while [[ 1 -eq 1 ]]
do
getTask
updateTask "in progress"
doTask
taskErrCode=$?
if [[ $taskErrCode -eq 0 ]]
then
updateTask "done, finished successfully"
else
updateTask "done, error $taskErrCode"
fi
taskCmd="";
taskLine=0;
done
答案 0 :(得分:2)
您可以使用flock
同时访问该文件:
exec 200>>/some/any/file ## create a file descriptor
flock -w 30 200 ## concurrently access /some/any/file, timeout of 30 sec.
您可以将文件描述符指向任务列表或任何其他文件,但当然是同一个文件以便flock
工作。一旦创建它的进程完成或失败,我将立即删除锁。当您不再需要时,您也可以自行取消锁定:
flock -u 200
使用示例:
ssh user@x.x.x.x '
set -e
exec 200>>f
echo locking...
flock -w 10 200
echo working...
sleep 5
'
如果任何步骤失败, set -e
将失败。使用sleep
时间播放并行执行此脚本。只需一个sleep
即可执行。
答案 1 :(得分:0)
尝试实施类似
的内容mutators
此致 克劳迪奥
答案 2 :(得分:0)
检查你是否正在重塑GNU Parallel:
parallel -S worker1 -S worker2 command ::: arg1 arg2 arg3
GNU Parallel是一个通用的并行程序,可以很容易地在同一台机器上或在你有ssh访问权限的多台机器上并行运行作业。它通常可以替换for
循环。
如果要在4个CPU上运行32个不同的作业,并行化的直接方法是在每个CPU上运行8个作业:
GNU Parallel会在完成后生成一个新进程 - 保持CPU处于活动状态,从而节省时间:
<强>安装强>
如果没有为您的发行版打包GNU Parallel,您可以进行个人安装,不需要root访问权限。这可以在10秒内完成:
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
有关其他安装选项,请参阅http://git.savannah.gnu.org/cgit/parallel.git/tree/README
了解详情
查看更多示例:http://www.gnu.org/software/parallel/man.html
观看介绍视频:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
完成教程:http://www.gnu.org/software/parallel/parallel_tutorial.html
注册电子邮件列表以获得支持:https://lists.gnu.org/mailman/listinfo/parallel