Bash

為什麼我的並行命令同時列印“Starting”和“Finished”?

  • January 1, 2018
ls *.txt | parallel 'echo Starting on file {}; mkdir {.}; cd {.}; longCMD3 ../{} > /dev/null; echo Finished file {}'

這一條線部分工作,除了 longCMD3 大約需要 3 分鐘,但第一個和第二個 echo 命令幾乎同時列印。我試著放進去

wait

在最後的迴聲之前,但這沒有任何區別。

如何確保僅在 longCMD3 完成後才列印最終的迴聲?

這是一個例子

假設我只有 4 個核心:

ls
foo1.txt foo2.txt foo3.txt foo4.txt foo5.txt foo6.txt 

我所期望的:

Starting on file foo1.txt
Starting on file foo2.txt
Starting on file foo3.txt
Starting on file foo4.txt

然後至少 2 分鐘應該通過 longCMD3 完成其中一個文件

Finished file foo1.txt
Starting on file foo5.txt

但我得到的是:

Starting on file foo1.txt
Finished file foo1.txt
Starting on file foo2.txt
Finished file foo2.txt
Starting on file foo3.txt
Finished file foo3.txt
Starting on file foo4.txt
Finished file foo4.txt

這對所有 6 個文件繼續進行。並且為每個文件同時列印 Start 和 Finished 語句。但是每個文件之間會花費幾分鐘。

對於每個文件,命令、、、和echo Starting on file foo.txt順序執行,即每個命令在前一個命令完成後開始。mkdir foo``cd foo``longCMD3 ../foo.txt > /dev/null``echo Finished file foo.txt

不同文件的命令是穿插的。預設情況下,parallel 命令並行執行與您擁有的核心一樣多的作業。

但是,預設情況下不會散佈命令的輸出。這就是為什麼您看不到一堆“開始”行,然後是相應的“完成”行。並行將每個作業的輸出分組在一起。它緩衝輸出直到作業完成。請參閱--group手冊中的選項說明。分組在您的情況下沒有意義,因此使用--ungroup( -u) 選項將其關閉,或使用 切換到行分組--line-buffer

其他一些更正:

  • 解析 ls 不可靠。將文件名parallel直接傳遞給。
  • 如果mkdir失敗,則不應繼續。如果任何命令失敗,您應該安排作業失敗。一種簡單的方法是使用set -e.
parallel --line-buffer 'set -e; echo Starting on file {}; mkdir {.}; cd {.}; longCMD3 ../{} > /dev/null; echo Finished file {}' ::: *.txt

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