2012-03-10 12 views
4

サイトにデータをアップロードするためのbashスクリプトがあります。私は遅いアップロード速度を得ていたので、xargsと-N1を使って同時に5を同時に実行しました。bashの並列プロセス間に待機時間を追加する

しかし、私が一度に5つずつ実行すると、サーバはcaptchaを解決するように求められますが、一度に1つでは問題なく動作します。

これは、すべてのプロセスがまったく同じ時刻に開始されるためです。フラグが立てられています。

とにかくここに質問がありますが、xargs/gnuパラレルでプロセスを開始する間に待ち時間(1秒)を追加する方法はありますか?

唯一のことは、pgrepスクリプトを使用することです。 wc -1はスクリプトインスタンスをカウントし、その秒数の間スリープします。

しかし、これは実際には最適ではありませんが、これを行うには良い方法がありますか?

+0

スクリプトを貼り付けることはできますか? –

+0

私はしたくないです:S – lelouch

答えて

4

アップロードにランダムな時間がかかる最初の5文字を​​1-5秒の遅延で開始する必要があります。

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

最初のビットを見つけて変更しました。これが実際に動作しています!私は本当にそれを理解していないが、ありがとうalot :) – lelouch

0

あなたは次のプロセスを開始するとき、今、あなたはあなた自身の意志で、決めることができ

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

を使用して、すべての工程の後に、スクリプトの実行を一時停止することができます。..

私は、これは手動の介入を必要とするものとします。しかし、この特定のケースでは5つのプロセスだけが開始されるため、うまくいくはずです。

EDITreadはあなたの自動化を停止したとして、あなたは、5秒間

sleep 5 

たLL睡眠を使用することができます。

+0

残念ながらそれは私のためにはうまくいかないでしょう。< 問題なくブラウザからやりたいことができますが、私はbash&curlを使ってすべてを自動化しています。 – lelouch

+0

私は自分の答えを編集しました。役に立ったのですか? –

+0

しかし、この場合、xargsはすべてのプロセスをほぼ即座に開始するので、5秒間スリープしてからすぐに起動して同じ問題が発生しますか? – lelouch

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

+0

@lelouch So/path/to/scriptはあなたが書いたスクリプトです。なぜ5つの引数を取って-n 5 -P 1をxargsの引数として使うか書き直さないでください。 –

+0

それは私には起こりませんでしたが、これを行う唯一の方法だと思われます。ありがとう:) – lelouch

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で始まり、08で終了し、13でファイルb 09から14をファイルし、10から15をファイルします。

+0

最終的には動作するようになって、並列に-qスイッチが必要になりました。しかし、バックグラウンドに行くので、すべてのファイルが一度に処理されます。 私は「眠りました。スクリプト{} '、それはどちらもうまくいきませんでした。私はジムが言ったように私はする必要があると思う... – lelouch

+0

私は例を含めました。問題の要点は、 '/ tmp/job {}&sleep 1'のバックグラウンドとそれに続く1秒間のスリープです。 N.B.これはGNUとよく似ています。 – potong

+0

それはうまくいく、私が意味することは、プロセスの数を制限する方法があるということですか? -J5はもう動作しません。これは何百ものファイルを処理するまで続きます。 – lelouch

関連する問題