xargs --max-proc 每個行程的分割輸出?

xargs --max-proc 每個行程的分割輸出?

我最近發現了這個xargs --max-procs功能。

如何按 proc 拆分指令的輸出?我應該創建一個 mycommand --logfile $LOGFILE,還是可以從 xargs 本身來完成它?

一個例子(womble):

假設我有腳本 myprocessor.sh 和檔案清單。它們可以按任何順序進行,但我想單獨保留每個日誌記錄,然後:

find $MY_FILE_TREE --print0 | xargs --null --max-procs 3 --max-args 1 --no-run-if-empty myprocess.sh  

可能是我想要運行的平行作業。如果myprocessor.sh是多嘴的,那麼我希望能夠將每個呼叫列印到不同的日誌中。否則,每個的標準輸出都是相同的,而且日誌會變得混亂。

答案1

您可以透過 shell 執行 xargs 命令來完成此操作 - 這將允許您重定向輸出 - 如下所示:

find blah -type f | xargs -I{} -P 4 -n 1 sh -c 'yourcommand --input {} > {}.output'

....您可能需要稍微調整一下 - xargs 將 {} 替換為其正在處理的項目/文件

答案2

GNU 平行http://www.gnu.org/software/parallel/似乎是為您量身定做的,因為它會自動正確地組合流程的標準輸出。

find $MY_FILE_TREE --print0 | parallel --null --max-procs 3 --max-args 1 --no-run-if-empty myprocess.sh ">" {}.output

或更短:

find $MY_FILE_TREE --print0 | parallel -0 -j3 -r myprocess.sh ">" {}.output

觀看介紹影片:http://www.youtube.com/watch?v=OpaiGYxkSuQ

答案3

您可以更改您的腳本,以便在啟動時它會選擇一個隨機數字/文本,然後在每一行前面加上這個數字?然後您可以稍後使用 grep 拆分它。

相關內容