2015-02-06 71 views
36

我目前擁有當前腳本。使用xargs並行運行程序

#!/bin/bash 
# script.sh 

for i in {0..99}; do 
    script-to-run.sh input/ output/ $i 
done 

我希望使用xargs並行運行它。我已經嘗試過

script.sh | xargs -P8 

但是這樣做只能在當時執行一次。 -n8也沒有運氣。 在該行的末尾添加&腳本中的for循環執行會嘗試一次運行該腳本99倍。我該如何執行循環只有8個,最多100個。

+4

使用GNU並行 – Barmar 2015-02-06 03:20:51

+0

這就是我最初想做的事,卻不得不因爲我是在Windows上訴諸xargs的。我無法在Windows上運行GNU Parallel – Olivier 2015-02-06 03:21:36

+0

這個腳本是自稱還是隻是在你問這裏時混淆了名字? – 2015-02-06 03:24:05

回答

50

xargs手冊頁:

本手冊頁文檔的xargs GNU版本。 xargs的讀取來自標準輸入項目 ,由坯件(其可以被保護 與雙或單引號或反斜槓)或換行符界定,並執行 命令(默認爲/ bin中/回波)與任何初始一次或多次 - 參數後跟從標準輸入讀取的項目。 上的空白行將被忽略。

這意味着對於您的示例,xargs正在等待並收集腳本的所有輸出,然後運行echo <that output>。不完全是有用的,也不是你想要的。

-n參數是如何從輸入的許多項目與每個被運行(沒什麼,本身有關並行這裏)命令使用。

要做到你需要做更多的東西像這樣(未經)你想xargs什麼:

printf %s\\n {0..99} | xargs -n 1 -P 8 script-to-run.sh input/ output/ 

這打破了這個樣子。

  • printf %s\\n {0..99} - 打印每行一個數從099
  • 運行xargs
    • 採取最多每次運行命令行一個參數
    • 和運行高達八道工序在同一時間
+3

其實你不需要把參數放在單獨的行上; xargs單詞分裂。所以'echo {0..99} |'也可以。 '<<< {0..99}'似乎不起作用;雖然'<<< word'被記錄爲大括號的單詞,但它不適用於任何版本的bash,我已經得心應手。 – rici 2015-02-06 03:41:33

+1

@rici看起來像一個文檔錯誤,特別是因爲Here Documents *的文檔沒有提及大括號擴展(在快速測試中它不會發生),儘管它們也沒有提及代字符擴展(它不會'''不會發生在'<<'上,但''''如此'*聳肩*')。在這裏的文檔和這裏的字符串的擴展不會發生在我的腦海裏有點奇怪。 – 2015-02-06 03:49:12

+0

如何將不同運行的結果與例如換行? – 2017-10-08 00:48:07

35

隨着GNU並行你會怎麼做:

parallel script-to-run.sh input/ output/ {} ::: {0..99} 

添加在-P8如果你不希望運行每個CPU核心一個作業。

相反xargs即使輸入包含空格',或者'(儘管這裏不是這樣),它也會做正確的事情,它也確保不同作業的輸出不會混合在一起,所以如果你使用輸出你保證你不會從兩個不同的工作中獲得半條命。

GNU Parallel是一個通用的並行程序,可以很容易地在同一臺機器上或在您擁有ssh訪問權限的多臺機器上並行運行作業。

如果你想在4個CPU上運行32個不同的工作崗位,並行化直接的方式是在每個CPU上運行8個作業:

Simple scheduling

GNU並行,而不是產生一個新的進程時,一個完成 - 保持CPU的活躍,從而節省了時間:

GNU Parallel scheduling

安裝

如果您的發行版沒有打包GNU Parallel,則可以執行個人安裝,但不需要root訪問權限。它可以在10秒內通過這樣來完成:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash 

對於其他安裝選項見http://git.savannah.gnu.org/cgit/parallel.git/tree/README

瞭解更多

查看更多的例子:http://www.gnu.org/software/parallel/man.html

觀看介紹視頻: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

穿過嘖嘖嘖嘖orial:http://www.gnu.org/software/parallel/parallel_tutorial.html

訂閱郵件列表,以獲得支持:https://lists.gnu.org/mailman/listinfo/parallel

+8

這並不回答這個問題,也沒有指出爲什麼xargs不能達到同樣的目的。 – 2016-12-30 04:17:50

+2

downvote因爲xarg對我來說完全如第二張圖片所示。 – noonex 2017-02-07 08:24:06

+0

@noonex您是否知道並非所有人都使用您使用的xargs版本,並且-P不是所有版本的xargs? – 2017-02-07 12:32:25