自動テスト用にいくつかのシェル スクリプトを実行するために、Process と Runtime を組み込んだ Java プログラムに取り組んでいます。これらのスクリプトは 1 つを除いてすべて正常に実行されるため、それに続くスクリプト呼び出しで問題が発生します。元:
process = runtime.exec("A.sh");
process = runtime.exec("B.sh");
process = runtime.exec("C.sh");
A.sh は正常に実行され、実行に数秒しかかかりません。ただし、B.sh の実行には数分かかります。これが C.sh の実行に問題を引き起こしていると思います。これは、両方が同じ MySQL テーブルと対話し、重複によって通信リンク障害が発生するためです。
不必要な情報であなたを過負荷にすることなく、私の質問は、次の exec() 呼び出しに移る前に、実行シェルスクリプトが完了/終了まで実行されたことを確認するにはどうすればよいですか?
私が試したこと:
process.waitFor()
これは機能しません。スクリプトが完全に完了するまで待たないと思います
process.wait(long time_period)
現在のスレッドが待機し、残りのシェル スクリプト呼び出しがスキップされ、次のテスト ケースが時期尚早に開始されるため、これは機能しません。
問題の原因となるシェル スクリプトは単純なスクリプトではありませんが、自分で書いたわけではなく、その背後で何をしているのかほとんど理解していません。私が持っている唯一の関連情報は、問題のMySQLデータベースに直接接続することですが、私のプログラムはjava.sql.*を使用してリモート接続します(リモートマシン上のローカルデータベースですが)。
編集:
提案に従って、Apache Commons Exec を調査し、新しい戦略を試みましたが、失敗しました。
ExecuteWatchdog watchdog = new ExecuteWatchdog(300000); //For five minutes
CommandLine cmdline = CommandLine.parse("./directory/shell.sh");
DefaultExecutor executor = setExitValue(0);
executor.setWatchdog(watchdog);
int exitVal = executor.execute(cmdLine);
//A line to log the exit val in another file
「shell.sh 開始」と「テスト 2 開始」というログに記録されたステートメントの間の時間は本質的に同じ瞬間であるため、私のログは、シェル スクリプトが実際に実行されたことを示唆するものではありません。実行は決して起こりません。どこで私は間違えましたか?