
我最近發現了這個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
答案3
您可以更改您的腳本,以便在啟動時它會選擇一個隨機數字/文本,然後在每一行前面加上這個數字?然後您可以稍後使用 grep 拆分它。