2016-10-10 101 views
1

腳本提交的文件,並提交後,提交的樣品的API的服務回報 「TASK_ID」(#task.csv猛砸多捲曲請求發出

#file_submitter.sh 

#!/bin/bash 

for i in $(find $1 -type f);do 
     task_id="$(curl -s -F [email protected]$i http://X.X.X.X:8080/api/abc/v1/upload &)" 
     echo "$task_id" >> task.csv 
done 

運行方法:

$./submitter.sh /home/files/ 

結果: (這裏761 & 762是API服務提交樣本的task_id)

#task.csv 

{"task_url": "http://X.X.X.X:8080/api/abc/v1/task/761"} 
{"task_url": "http://X.X.X.X:8080/api/abc/v1/task/762"} 

我給整個文件夾路徑(find $1 -type f)查找目錄中的所有文件以上載文件。現在,我使用「&」運算符來提交/上傳文件夾中的文件,該文件夾將從API服務(stdout)生成'task_id',我希望'task_id'(標準輸出)將其存儲在'task.csv'中。但是上傳帶有"&"而沒有"&"的文件的時間是相同的。有沒有更多的方法來提交併行/更快?有什麼建議嗎?

回答

1

您可以使用xargs-P選項:

find "$1" -type f -print0 | 
xargs -0 -P 5 -I{} curl -s -F file='@{}' http://X.X.X.X:8080/api/abc/v1/upload >> task.csv 

這將通過開展並行5個curl過程中減少總的執行時間。

+0

使用xargs,當我給路徑'./submitter.sh/home/files/pdf /'時,它只返回一個結果。假設文件夾pdf有5個文件,輸出結果必須大約是5個task_ids的權利? – Arun

+0

立即嘗試我更新的答案。 – anubhava

+1

它運作良好!謝謝 – Arun

1

命令替換內部的命令$()在子外殼中運行;所以在這裏你發送curl命令在該子shell的後臺,而不是父shell。

擺脫命令替換的,只是做:

curl -s -F [email protected]$i http://X.X.X.X:8080/api/abc/v1/upload >task.csv & 
+0

要存儲推出,'回聲過程的TASK_ID curl命令後的>> task.cv'。 – Inian

1

你告訴shell將命令替換($())內並行。這不會做你想做的。試試這個:

#!/bin/bash 

for i in $(find $1 -type f);do 
     curl -s -F [email protected]$i http://X.X.X.X:8080/api/abc/v1/upload & 
done > task.csv 
#uncomment next line if you want the script to pause until the last curl is done 
#wait 

這使curl到背景和它的輸出保存到task.csv

+0

謝謝埃裏克。 'task_id'不是機器的任務/進程(echo $!)。這是在提交樣本時由API服務自動生成的。更新了問題 – Arun

+1

我編輯了答案以反映更新 – Eric

+0

完美無缺。使用(&)&符號時啓動多少進程。因爲出來的結果,我得看到這麼多的錯誤信息。由於我一次發送的請求數量。我們可以限制我們發送的查詢嗎? – Arun

1

anubhava建議使用xargs-P選項:

find "$1" -type f -print0 | 
xargs -0 -P 5 curl -s -F [email protected] http://X.X.X.X:8080/api/abc/v1/upload >> task.csv 

然而,追加到並聯同一文件通常是一個壞主意:你真的需要知道了很多關於這個版本的操作系統如何緩衝輸出爲了安全起見。這個例子表明爲什麼:

#!/bin/bash 

size=3000 

myfile=/tmp/myfile$$ 
rm $myfile 

echo {a..z} | xargs -P26 -n1 perl -e 'print ((shift)x'$size')' >> $myfile 

cat $myfile | perl -ne 'for(split//,$_){ 
    if($_ eq $l) { 
    $c++ 
    } else { 
    /\n/ and next; 
    print $l,1+$c," "; $l=$_; $c=0; 
    } 
}' 
echo 

隨着size=10你總是會得到(順序可能會有所不同):

1 d10 i10 c10 n10 h10 x10 l10 b10 u10 w10 t10 o10 y10 z10 p10 j10 q10 s10 v10 r10 k10 e10 m10 f10 g10 

這意味着該文件包含10 D的隨後10我,再接10℃的等。即26個職位的產出沒有混合。

但其更改爲size=30000和你喜歡的東西:

1 c30000 d30000 l8192 g8192 t8192 g8192 t8192 g8192 t8192 g5424 t5424 a8192 i16384 s8192 i8192 s8192 i5424 s13616 f16384 k24576 p24576 n8192 l8192 n8192 l13616 n13616 r16384 u8192 r8192 u8192 r5424 u8192 o16384 b8192 j8192 b8192 j8192 b8192 j8192 b5424 a21808 v8192 o8192 v8192 o5424 v13616 j5424 u5424 h16384 p5424 h13616 x8192 m8192 k5424 m8192 q8192 f8192 m8192 f5424 m5424 q21808 x21808 y30000 e30000 w30000 

首先30K C'S,然後30K D's,則8K L's,則8K克氏,8K T的,然後又8K克氏,等等。即26項產出混合在一起。非常不好。

因此,我建議不要並行追加到同一個文件:存在競爭條件的風險,並且通常可以避免。

在你的情況,你可以簡單地使用GNU並行,而不是xargs的,因爲GNU並行衛士對本場比賽狀態:「$」

find "$1" -type f -print0 | 
parallel -0 -P 5 curl -s -F [email protected]{} http://X.X.X.X:8080/api/abc/v1/upload >> task.csv