2012-03-10 16 views
4

我有一个bash脚本来上传数据到一个站点。我的上传速度很慢,所以我开始同时运行它,同时使用xargs和-N1。在bash中的并行进程之间添加等待

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

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

无论如何,这里的问题是,有没有什么办法让我在xargs/gnu parallel中的启动进程之间添加等待(比如说1秒)?

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

但是,这真的不是最佳的,有没有更好的方法来做到这一点?

+0

你能粘贴你的脚本吗? – 2012-03-10 04:26:21

+0

我不想:S – lelouch 2012-03-10 04:43:19

回答

4

如果上传需要一个随机的时间量,需要第一个5以1-5秒的延迟开始:

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

改变了开始位找到,这实际上是工作!我甚至没有真正理解它,但非常感谢:) – lelouch 2012-03-12 17:24:07

0

可以使用

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

现在你可以决定每一个过程后暂停脚本执行,在你自己的意愿何时开始下一道工序..

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

编辑:作为read停止自动化您可以使用

sleep 5 

其中LL睡眠5秒。

+0

不幸的是,这对我不起作用。< 我可以在浏览器中做我想做的事情,但没有问题,但我使用bash&curl自动完成所有操作。 – lelouch 2012-03-10 04:36:52

+0

我编辑了我的答案。看看它是否有帮助 – 2012-03-10 04:48:15

+0

但是在这种情况下,因为xargs几乎立即启动所有进程,难道他们都不会只休眠5秒,然后立即启动,导致同样的问题? – lelouch 2012-03-10 04:56:38

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 
+0

我使用xargs,如下所示:find。 -type f -name“* .txt”-print0 | xargs -0 -n 1 -P 5/path/to/script /,并且有5个以上的文件需要处理。不要以为这会起作用,因为不够清楚而感到抱歉>。< – lelouch 2012-03-10 08:03:18

+0

@lelouch所以/ path/to/script是你写的脚本。为什么不重新编写它以获取5个参数并使用-n 5 -P 1作为xargs的参数。 – 2012-03-10 13:39:28

+0

这并没有发生在我身上,但是,似乎这是唯一的方法。谢谢:) – lelouch 2012-03-10 18:15:45

1

这可能会为你工作(使用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和文件10到15.

+0

最后得到这个工作,需要一个平行的q切换..但是,这将导致所有文件一次处理,因为他们去背景。 我试过'睡觉;脚本{}',并且这也不起作用。我想我需要像吉姆说的那样去做...... – lelouch 2012-03-10 18:10:15

+0

我已经包括了一个例子。问题的症结在于'/ tmp/job {}&sleep 1'的背景,接着是睡眠一秒钟。注:这是GNU并行不是更多。 – potong 2012-03-10 20:34:40

+0

是的,它的作用,我的意思是,有没有办法限制进程的数量? -J5不再工作,这将继续下去,直到它处理所有的数百个文件。 – lelouch 2012-03-11 03:31:11