バックグラウンドで実行されるプロセス(一部のファイルを生成するプログラム)の実行を並列化し、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