Bash
為什麼我的並行命令同時列印“Starting”和“Finished”?
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
。其他一些更正:
parallel --line-buffer 'set -e; echo Starting on file {}; mkdir {.}; cd {.}; longCMD3 ../{} > /dev/null; echo Finished file {}' ::: *.txt