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

时间:2012-03-10 04:06:57

标签: linux bash shell parallel-processing xargs

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

然而,问题是服务器要求我解决验证码,如果我一次运行5,而它一次正常工作。

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

无论如何所以这就是问题,我有什么方法可以在xargs / gnu parallel中的启动过程之间添加等待(比如说1秒)吗?

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

然而,这真的不是最佳的,有没有更好的方法呢?

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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

答案 2 :(得分:1)

这可能适合你(使用GNU parallel):

 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,并提交10到15。

答案 3 :(得分:0)

您可以使用

在每个进程后暂停脚本执行
read -p "Press [Enter] key to continue..".

现在您可以根据自己的意愿决定何时开始下一个过程..

我同意这涉及人工干预。但是因为在这种特殊情况下只有5个进程可以启动,所以应该可以正常工作。

编辑:当read停止自动操作时,您可以使用

sleep 5 

将睡5秒钟。