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

siotufzp  于 2023-05-01  发布在  Shell
关注(0)|答案(5)|浏览(159)

我有一个bash脚本来上传数据到一个网站。我的上传速度变慢了,所以我开始并行运行它,同时运行5个,使用xargs和-N1。
然而,问题是,如果我一次运行5个验证码,服务器会要求我解决一个验证码,而一次运行1个验证码就可以了。
我想这是因为所有的进程都在同一时间开始,我被标记了。

无论如何,这里有一个问题,有没有办法让我在xargs/gnu并行的启动进程之间增加一个等待时间(比如1秒)?

我唯一能想到的就是使用pgrep脚本|wc-1对脚本示例进行计数,并休眠该秒数。
然而,这并不是最佳的,有没有更好的方法呢?

23c0lvtd

23c0lvtd1#

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

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

blpfk2vs2#

与其使用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
djmepvbi

djmepvbi3#

这可能对你有用(使用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结束。

nbysray5

nbysray54#

您可以在每个进程结束后暂停脚本执行

read -p "Press [Enter] key to continue..".

现在你可以决定,在你自己的意志,当开始下一个过程。.
我同意这涉及手动干预。但是由于在这个特定的情况下只有5个过程要启动,所以应该可以很好地工作。

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

sleep 5

它会休眠5秒。

z4bn682m

z4bn682m5#

GNU parallel有一个--delay选项可用于此目的。它防止所有作业同时启动,并保证启动之间的最小延迟。使用

cat list | parallel -j5 --delay 5s upload {}

将确保每次upload执行间隔至少5秒。

相关问题