在 bash 中的并行进程之间添加等待

Posted

技术标签:

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

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

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

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

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

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

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

【问题讨论】:

【参考方案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 秒然后立即启动,导致同样的问题吗?

以上是关于在 bash 中的并行进程之间添加等待的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程

并发 并行 同步 异步 多线程的区别

Bash 等待进程启动

Python线程化多个bash子进程?

数据挖掘_多进程抓取

捕获信号时如何正确等待bash子进程完成