Bash バックグラウンド実行は返されません。

Bash バックグラウンド実行は返されません。

バックグラウンドで実行されるプロセス(一部のファイルを生成するプログラム)の実行を並列化し、forループ内のすべてのコマンドが完了したら、追加のコマンドが実行されるスクリプトを作成しようとしています。生成されたコマンド)ファイルを別のフォルダに保存します。これが私が今まで来たものです:

#!/bin/bash

for f in ./lqns/*.lqn
do
    java -jar DiffLQN.jar $f &
done
mv ./lqns/*.csv csvs

並列処理は機能しますが、回線に到着せず、mv端末は待ってから返されません。なぜ戻らないのですか?どうすれば解決できますか?

問題は&決勝戦にあるのではないだろうか?別の命令を待つが、もう待たないから?行を追加してもmv問題は解決しそうです。

答え1

csvファイルがjavaコマンドによって生成された場合、mvファイルが生成される前に実行されるため、この操作は失敗します。すべてのJavaプロセスがバックグラウンドで送信されるため、ループはほぼすぐに完了するため、スクリプトは実行され続け、mv移動するファイルを見つけることができないため、何もしません。

簡単な解決策は、wait.from help wait(bashシェルで)を使用することです。

$ 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次のmvコマンドを組み合わせることもできます。

#!/bin/bash

for f in ./lqns/*.lqn
do
    java -jar DiffLQN.jar "$f" && mv /lqns/*.csv csvs &
done

parallelおそらくより良いもう1つのオプションは、この種の作業用に特別に設計されたツールである実行中のオペレーティングシステムのリポジトリにある必要があるGNUを使用することです。それでできます:

parallel java -jar DiffLQN.jar ::: ./lqns/*.lqn
mv ./lqns/*.csv csvs

関連情報