Bash
Bash後台執行不返回
我正在嘗試編寫一個腳本,其目的是並行化在後台執行程序的執行(創建一些文件的程序),並且當 for 循環中的所有命令完成後,將執行一個額外的命令(即移動所有生成的另一個文件夾中的文件)。這就是我目前得出的結論:
#!/bin/bash for f in ./lqns/*.lqn do java -jar DiffLQN.jar $f & done mv ./lqns/*.csv csvs
並行性有效,但它們永遠不會到達
mv
線路,終端等待並且不會返回。為什麼不返回?我該如何解決?也許問題是
&
決賽的問題?因為它等待另一個命令,但沒有更多?即使添加mv
我認為會解決它的行…
如果 csv 文件是由 java 命令生成的,這將失敗,因為
mv
它將在任何文件生成之前執行。由於所有 java 程序都被發送到後台,因此循環幾乎會立即結束,因此腳本繼續執行mv
,找不到要移動的文件,因此什麼也不做。一個簡單的解決方案是使用
wait
. 從help wait
(在 bash shell 中):$ help wait wait: wait [-fn] [-p var] [id ...] Wait for job completion and return exit status. Waits for each process identified by an ID, which may be a process ID or a job specification, and reports its termination status. If ID is not given, waits for all currently active child processes, and the return status is zero. If ID is a job specification, waits for all processes in that job's pipeline.
這裡的相關位是“如果沒有給出 ID,則等待所有目前活動的子程序”。這意味著您可以
wait
在循環之後添加,這將使腳本等到所有子程序完成後再繼續:#!/bin/bash for f in ./lqns/*.lqn do java -jar DiffLQN.jar "$f" & done wait mv ./lqns/*.csv csvs
或者,您可以組合
java
andmv
命令:#!/bin/bash for f in ./lqns/*.lqn do java -jar DiffLQN.jar "$f" && mv /lqns/*.csv csvs & done
另一個可能更好的選擇是使用 GNU
parallel
(它應該在您正在執行的任何作業系統的儲存庫中),這是一種專為此類事情而設計的工具。有了它,你可以這樣做:parallel java -jar DiffLQN.jar ::: ./lqns/*.lqn mv ./lqns/*.csv csvs