Bash

Bash後台執行不返回

  • November 26, 2021

我正在嘗試編寫一個腳本,其目的是並行化在後台執行程序的執行(創建一些文件的程序),並且當 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

或者,您可以組合javaandmv命令:

#!/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

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