2010-07-23 164 views
11

我試圖在shell腳本中使用xargs來運行我在同一腳本中定義的函數的並行實例。這個函數用於取得頁面,所以重要的是實際上並行地在並行進程中提取頁面,而不是在後臺進程中(如果我對這種錯誤的理解是錯誤的,並且兩者之間的差異可以忽略不計,請讓我知道) 。Shell腳本:使用xargs執行shell函數的並行實例

功能是:

function time_a_url() 
{ 
    oneurltime=$($time_command -p wget -p $1 -O /dev/null 2>&1 1>/dev/null | grep real | cut -d" " -f2) 
    echo "Fetching $1 took $oneurltime seconds." 
} 

怎樣才能用,可以採取的次數並行運行time_a_url作爲自變量的形式xargs的管做到這一點?是的,我知道GNU並行,我只是沒有權限在我寫這個軟件的地方安裝軟件。

回答

11

這裏是你如何能夠讓你的函數的工作演示:

$ f() { echo "[[email protected]]"; } 
$ export -f f 
$ echo -e "b 1\nc 2\nd 3 4" | xargs -P 0 -n 1 -I{} bash -c f\ \{\} 
[b 1] 
[d 3 4] 
[c 2] 

的關鍵在於使這項工作是export功能使bashxargs產卵會看到它,並逃脫函數名稱和轉義括號之間的空格。你應該能夠適應你的情況。您需要調整參數-P-n(或刪除它們)以滿足您的需求。

你可能會擺脫grepcut。如果您使用Bash內建time,則可以使用TIMEFORMAT變量指定輸出格式。如果您使用的是GNU /usr/bin/time,則可以使用--format參數。這些都可以讓你放棄-p

您可以用命令替換這部分:2>&1 1>/dev/null-q。無論如何,你都會扭轉局面。正確的順序是>/dev/null 2>&1。在Mac OS X上:

+1

我用'xargs的-P0 -n1 -I {}的bash -c 「F {}」'其仍然有效,並且似乎小整潔。 – 2011-08-30 16:32:32

0

如果您在另一個系統上安裝GNU Parallel,您會看到該功能位於單個文件(稱爲並行)中。

您應該能夠簡單地將該文件複製到您自己的〜/ bin。

1

xargs:max。過程必須> 0(爲:xargs的-P [> 0])

f() { echo "[[email protected]]"; } 
export -f f 

echo -e "b 1\nc 2\nd 3 4" | sed 's/ /\\ /g' | xargs -P 10 -n 1 -I{} bash -c f\ \{\} 

echo -e "b 1\nc 2\nd 3 4" | xargs -P 10 -I '{}' bash -c 'f "[email protected]"' arg0 '{}'