【问题标题】:Add wait between parallel processes in bash在 bash 中的并行进程之间添加等待
【发布时间】:2012-03-27 11:33:27
【问题描述】:

我有一个 bash 脚本可以将数据上传到站点。我的上传速度越来越慢,所以我开始并行运行它,同时使用 5 个,使用 xargs 和 -N1。

但是,问题在于,如果我一次运行 5 个验证码,服务器会要求我解决验证码,而一次运行 1 个则可以正常工作。

我认为这是因为所有进程都在完全相同的时间开始,我被标记了。

无论如何,问题来了,我有什么办法可以在 xargs/gnu 并行启动进程之间添加等待(比如 1 秒)?

我唯一能想到的就是使用 pgrep 脚本 | wc -1 来计算脚本实例,并休眠该秒数。

但是,这确实不是最优的,有没有更好的方法来做到这一点?

【问题讨论】:

    标签: linux bash shell parallel-processing xargs


    【解决方案1】:

    如果上传需要随机的时间,您只需要前 5 个以 1-5 秒的延迟开始:

    cat list | parallel -j5 [ {#} -lt 6 ] \&\& sleep {#}\; upload {}
    

    【讨论】:

    • 将开始位更改为查找,这确实有效!我什至不是很明白,但非常感谢:)
    【解决方案2】:

    我认为你只需要一个循环,而不是使用 xargs,如

    for i in {1..5}; do sleep 5; your-command & done
    

    这会每 5 秒分叉一次命令。对于增加延迟(如果需要):

    for i in {1..5}; do ((w=i*5)); sleep $w; your-command & done
    

    另一种选择:

    files="a.txt b.txt c.txt"
    for i in $files; do upload-command $i& sleep 5; done
    

    【讨论】:

    • 我正在使用 xargs 和这样的 find : find 。 -type f -name "*.txt" -print0 | xargs -0 -n 1 -P 5 /path/to/script/ ,需要处理的文件超过5个。不要认为这会起作用,抱歉不够清楚>.
    • @lelouch 所以 /path/to/script 是您编写的脚本。为什么不重写它以获取 5 个参数并使用 -n 5 -P 1 作为 xargs 的参数。
    • 我没有想到,但是是的,这似乎是唯一的方法。谢谢:)
    【解决方案3】:

    这可能对你有用(使用 GNU 并行):

     find . -type f -name "*.txt" -print | parallel 'script {} & sleep 1'
    

    这是一个显示示例运行的终端会话:

    for x in {a..c};do for y in {1..3};do echo $x >>$x;done;done
    ls
    a  b  c
    cat a
    a
    a
    a
    cat /tmp/job
    #!/bin/bash
    sed -i -e '1e date' -e 's/./\U&/' $1
    sleep 5
    sed -i '${p;s,.*,date,e}' $1
    find . -type f -name "?" -print | parallel '/tmp/job {} & sleep 1'
    cat ?
    Sat Mar 10 20:25:10 GMT-1 2012
    A
    A
    A
    Sat Mar 10 20:25:15 GMT-1 2012
    Sat Mar 10 20:25:09 GMT-1 2012
    B
    B
    B
    Sat Mar 10 20:25:14 GMT-1 2012
    Sat Mar 10 20:25:08 GMT-1 2012
    C
    C
    C
    Sat Mar 10 20:25:13 GMT-1 2012
    

    如您所见,每个作业的开始时间间隔为一秒,即文件 c 从 08 开始,在 13 结束,文件 b 从 09 到 14,文件 a 从 10 到 15。

    【讨论】:

    • 终于让它工作了,需要一个并行的 -q 开关。但是,这会导致所有文件都被立即处理,因为它们进入了后台。我试过'睡觉;脚本{}',这也不起作用。我想我需要按照吉姆说的做......
    • 我已经包含了一个示例。问题的关键是/tmp/job {} & sleep 1 的背景,然后是一秒钟的睡眠。注:这是 GNU 并行而不是 Moreutils。
    • 是的,它有效,我的意思是,有没有办法限制进程的数量? -J5 不再工作了,这将继续进行,直到它处理完所有数百个文件..
    【解决方案4】:

    您可以在每个进程之后使用

    暂停脚本执行
    read -p "Press [Enter] key to continue..".
    

    现在您可以自行决定何时开始下一个流程..

    我同意这涉及人工干预。但由于在这种特殊情况下只需要启动 5 个进程,它应该可以正常工作。

    编辑:由于read 停止您的自动化,您可以使用

    sleep 5 
    

    它会睡 5 秒。

    【讨论】:

    • 不幸的是,这对我不起作用>。
    • 但是在这种情况下,由于 xargs 几乎立即启动所有进程,它们不会都只是休眠 5 秒然后立即启动,导致同样的问题吗?
    猜你喜欢
    • 1970-01-01
    • 2014-07-02
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 2021-10-09
    • 2022-06-14
    相关资源
    最近更新 更多