Xargs

保留 xargs 並行執行的命令的輸出順序

  • July 8, 2019

當我執行一個xargs -n 1 -P 0用於並行執行的命令時,輸出都是混亂的。有沒有辦法進行並行執行,但要確保在第二次執行的輸出開始之前將第一次執行的整個輸出寫入stdout,在第三次執行的輸出之前將第二次執行的整個輸出寫入stdout執行開始等?

例如,當想要對包含大量數據的許多文件進行雜湊處理時,可以這樣做:

printf "%s\0" * | xargs -r0 -n 1 -P 0 sha256sum

我在少量數據(9 GB)上對此進行了測試,並在 5.7 秒內完成。使用散列相同的數據

sha256sum *

耗時 34.1 秒。我經常需要散列大量數據(這可能需要幾個小時),因此並行處理可以更快地完成工作。

這裡的問題是輸出行的順序是錯誤的。在這種情況下,可以通過簡單地按第二列對行進行排序來修復它。但這並不總是那麼容易。例如,在堅持上面的散列範例但想要按順序散列編號文件時,這已經中斷:

printf "%s\0" {1..10000} | xargs -r0 -n 1 -P 0 sha256sum

這需要更高級的排序。如果我們完全離開散列範例,事情會變得更加複雜。

在評論中,有人問我是否只想防止輸出交錯。不是這種情況。我想保留訂單。

您可以使用 GNU Parallel ( --keep-order) 來做到這一點:

printf "%s\0" {1..10000} | parallel --keep-order -r0 -n 1 -P 0 sha256sum

引用自:https://unix.stackexchange.com/questions/528542