2

Javaプログラム内からシェルスクリプトを非同期で実行したい(つまり、Javaプログラムがそのシェルスクリプトの実行を開始した後、他の操作を続行する)、シェルスクリプトが応答を返したときにのみさらに作業を行う..つまり、シェルスクリプトの応答を明示的に停止して待機することはありません。

これは可能/実行可能ですか?そのような機能を実装するにはどうすればよいですか?

基本的に、私はそれらすべてのサーバーを管理する単一のサーバーを使用して複数のサーバーを監視します-このため、それらのサーバーのそれぞれでシェルスクリプトを実行します...多くのサーバーがあるため、Javaではスレッドの数は推奨されませんcpuコアの数を超えています...したがって、スレッドに依存しないこの問題の解決策が必要です(スレッドの制限のため)...そのため、このようなシェルスクリプトの多くを同時に(またはほぼ同時に)起動できます。これらのスクリプト応答の1つを待機しています(待機すると他のシェルスクリプトコマンドの処理に影響するため)...別の問題..シェルコマンドはローカルマシンまたはリモートマシンのいずれかで呼び出す必要があり、両方のタイプの応答が必要です。シェルスクリプトの実行(つまり、ローカル実行とリモート実行)..。

4

3 に答える 3

5

何かやってみましたか?

次のようなことを試すことができます:

ProcessBuilder builder = new ProcessBuilder("your command to launch script");
Process process = builder.start();

また、デフォルトではプロセスが完了するのを待たないので、次にコードを実行できます。

また、プロセスの終了後に処理を実行する場合は、次のことを試すことができます。

int exitVal = process.waitFor();
于 2013-01-07T06:34:08.503 に答える
2

別のプロセスを実行してそのプロセスから結果を取得する場合、出力バッファーがいっぱいになるとプロセスがブロックされる可能性があるため、通常はそのプロセスの出力を読み取る必要があります。これを実現する最も簡単な方法は、Javaアプリケーションに単一のスレッドを設定して、スクリプトを開始し、その出力をバッファーに読み込むことです。Javaアプリケーションの他のスレッドは、やりたいことを何でも実行できます。プロセスが完了すると、スレッドはそのイベントについて他のスレッドに通知して終了できます。

CPUよりも多くのスレッドを使用しないというあなたの推奨がどこから来ているのかはわかりませんが、一般的にはそれを支持しません。これは、アクティブな各スレッドが1つのコアをビジー状態に保つワーカースレッドにも当てはまりますが、この場合、ほとんどのスレッドはほとんどの時間アイドル状態になります。アイドル状態のスレッドにも関連するOSレベルのリソースオーバーヘッドがあるため、実際に多くのプロセスがある場合は、単一のスレッドを使用してすべてのストリームから読み取る方がよいでしょうが、はるかに複雑です。

于 2013-01-07T06:30:53.993 に答える
0

アプリケーションのメインスレッドとは別のスレッドでRuntime.execまたはProcessBuilderを使用して、シェルスクリプトを非同期で実行できます。

この投稿では、RuntimeまたはProcessBuilderの使用方法を示します。知らない場合は、この投稿を読んでJavaスレッドを学習してください。

于 2013-01-07T06:33:55.840 に答える