在 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 中的并行进程之间添加等待的主要内容,如果未能解决你的问题,请参考以下文章