在bash中运行动态数量的异步任务

时间:2014-07-24 10:15:33

标签: bash

我有一个bash脚本应该在配置文件中的所有ID上运行同步任务oil r cron:sync $id,因为我对bash很新,我想知道如何去做。

问题是,同步必须每10秒完成一次,它不应该等待同步,因此我在同步之间使用&

目前我有这个文件:

#!/bin/bash

cd /var/www/script/

i="0";

function dsync {
        oil r cron:sync $1
}


while [ $i -lt 10 ]; do
        echo ">> Syncing IDs - loop $i"
        dsync 126776804 & dsync 108792704 & dsync 108291602

        sleep 10
        i=$[$i+1]
done

现在的问题是,如果我在每一行都有一个文件,那么必须同步的ID,我该怎么办呢?

3 个答案:

答案 0 :(得分:1)

启动任务时的语法错误。要在后台启动它们,您需要将它们放在不同的行上:

dsync 126776804 &
dsync 108792704 &
dsync 108291602 &

您还在说it should not wait for a sync。有了这个,我假设你不关心任务的返回状态,这个假设是否正确?

答案 1 :(得分:1)

我认为你想要的是:

#!/bin/bash

cd /var/www/script/

i="0";

function dsync {
        oil r cron:sync $1
}


while [ $i -lt 10 ]; do
        echo ">> Syncing IDs - loop $i"

        for j in $(cat ids.txt); do
          dsync $j &
        done

        sleep 10
        i=$[$i+1]
done

答案 2 :(得分:1)

对于dsync的并行调用的可变计数,您可以在表单中使用xargs

xargs -n1 -I% -P0 oil r cron:sync % < filename_with_IDs

管道示例

seq 100010 100015 | xargs -n1 -I% -P0 echo oil r cron:sync %

产生

oil r cron:sync 100011
oil r cron:sync 100010
oil r cron:sync 100012
oil r cron:sync 100013
oil r cron:sync 100014
oil r cron:sync 100015

(ofc,您需要删除echo

-P0确保并行执行任意数量的参数(分叉到背景中)

来自男人:

  

-P max-procs

     

一次运行max-procs进程;默认值为1.如果max-procs为0,则xargs将运行多次   尽可能一次处理。将-n选项与-P一起使用;否则机会只有一个执行官   将会完成。