加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用bash&ssh的远程任务队列,用于可变数量的实时工作者

发布时间:2020-12-15 22:58:14 所属栏目:安全 来源:网络整理
导读:我想使用批处理将工作从主服务器分发到多个工作服务器. 理想情况下,我会有一个tasks.txt文件,其中包含要执行的任务列表 cmd args 1cmd args 2cmd args 3cmd args 4cmd args 5cmd args 6cmd args 7...cmd args n 并且每个工作服务器将使用ssh进行连接,读取文
我想使用批处理将工作从主服务器分发到多个工作服务器.

理想情况下,我会有一个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

解决方法

您可以使用flock同时访问该文件:

exec 200>>/some/any/file ## create a file descriptor
flock -w 30 200 ## concurrently access /some/any/file,timeout of 30 sec.

您可以将文件描述符指向您的任务列表或任何其他文件,但当然是相同的文件以便工作.一旦创建它的进程完成或失败,我将立即删除锁.您也可以在不再需要时自行移除锁定:

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将使脚本失败.播放睡眠时间并行执行此脚本.一次只能执行一次睡眠.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读