問題タブ [apache-commons-exec]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
5 に答える
9367 参照

java - commons-exec で /bin/sh を実行するには?

これは私がやっていることです:

これは出力です:

私は何を間違っていますか?

0 投票する
3 に答える
1764 参照

java - Apache Commons Exec からのログ出力を防ぐ方法

JBoss 4.2.3 の Web アプリケーションで Apache Commons Exec を使用しています。Apache Exec を呼び出すたびに、すべてのコンソール出力がログに出力されます。これは大量の出力であり、運用環境でログを簡単に埋めることができます。このログが印刷されないようにして、エラー ログのみを表示するにはどうすればよいですか?

よろしく

0 投票する
3 に答える
7962 参照

java - ApacheCommonsExecプロセスのグレースフルキル

Javaプログラム(Linux上)で外部プロセスを開始していますが、送信しているSIGKILLではなくSIGTERMシグナルを送信する機能が必要exec.getWatchdog().destroyProcess()です。commons-execで開始されたUNIXプロセスをより適切に停止できる方法はありますか?または、適切なkillコマンドを自分で実行できるようにPIDを取得できますか?

0 投票する
2 に答える
1858 参照

java - Commons Exec での CommandLine への空の引数の処理

Java から 3 つのパラメーターを受け取る bash スクリプトを実行しようとしています。以下は、コマンド ラインを作成するコードです。

空でないパラメーターが渡された場合、これは魅力のように機能します。しかし、パラメータの 1 つが空であると想定されているように機能しません (つまり、"")

詳しく言うと、場合によっては Param2 = "". これで、bash スクリプトが実行されると、Param2 = "" と見なされる代わりに、Param2 = Param 3 (値) および Param3 = undefined が使用されます。

これが起こらないようにするにはどうすればよいですか?

編集: Param1、Param2 & Param3 は、実際には bash スクリプトに渡されるファイル名です。ここで、Param1 => File1、Param2 => File 2 & Param3 => 出力ファイル

Bash スクリプトは、実際にはファイル 1 でいくつかのメトリックを呼び出して生成し、それを出力ファイルに保存しています。メトリックを生成する場合、生成されるメトリックには 2 つのカテゴリがあります。

  1. 絶対の
  2. 相対的

絶対はファイル 1 で生成され、相対はファイル 1 とファイル 2 を比較した後に生成されます。bash スクリプトでは、ファイル 2 が引数として渡されない場合、相対メトリックを生成しないという条件があります。

これがデザインになったものです。ここで、比較用のファイル 2 が存在しない場合に問題が発生します。この場合、絶対メトリックを生成し、相対メトリックを除外します。

しかし、今私に起こっていることは、Param 3 (つまり、出力ファイル) が File 2 (完全に望ましくない) と見なされ、相対メトリックの生成がトスになることです。

Runtime.getRuntime().exec を使用すると、引用することでこれを行うことができました。ie /bin/bash Script Param1 "" Param3 これは魅力的に機能しました。

コードを削減し、クロスプラットフォームのサポートを強化しようとして、commons-exec を導入したところ、問題が発生し始めました。

それで、私の質問はまだです、Param2の値を空にして、commons-execコマンドラインを使用してスクリプトをbashに渡すにはどうすればよいですか?

0 投票する
1 に答える
6314 参照

java - PumpStreamHandlerを使用したログファイルへの出力とエラーの書き込み

プロセス出力とエラーストリームをログファイルに書き込むための良い例を得るために、しばらく探していました。プロセスを実行するためにapache-commonsexecライブラリを使用しています。それを実証するためのコードサンプルに従う

0 投票する
3 に答える
744 参照

java - Javaからシェルスクリプトを実行する

commons execパッケージを使用してJavaのシェルスクリプトを実行し、PumpStreamHandlerを使用してSTDOUTおよびSTDERRバッファーをクリアしようとしています。ほとんどのスクリプトは問題なく正常に実行されますが、一部のスクリプトはハングします。

特に、戻るのに時間がかかるスクリプト。私の推測では、PumpStramHandleは、しばらくの間ストリームに何も置かれず、その後バッファがいっぱいになるため、ストリームの終わりを読み取っている可能性があります。

この問題を解決するためのより良い方法はありますか?

0 投票する
3 に答える
1103 参照

java - Apache CommonsのCommandLineオブジェクトはコマンドラインインジェクションから保護しますか?

org.apache.commons.execJavaライブラリを使用して実行可能ファイルを呼び出したい。オブジェクトはCommandLineコマンドラインインジェクションから保護しますか?たとえば、私が呼び出す場合:

意図したコマンドにrm -rf ~/*加えて実行されますか?もしそうなら、これから保護するための最良の方法は何ですか?

APIはaddArgument()「引用符を処理する」と言っていますが、このコンテキストでそれが何を意味するのかわかりません。Linuxボックスで何が起こるかを確認するためにテストケースを作成することもできますが、他のプラットフォームでも安全であることを確認したいと思います。

0 投票する
1 に答える
1020 参照

java - サブプロセスを実行しようとすると、標準出力のみが出力されて終了します

私は Apache Commons Exec を使用しており、アプリケーションの全期間にわたって機能するサブプロセスを開始しようとしています。プロセスを開始し、2 つの入力コマンドを受け入れ、バックグラウンドで待機する必要があります。現在は、1 つのコマンド (少なくとも stdout が表示するもの) のみを受け入れて終了します。あなたは私を助けることができますか?

0 投票する
3 に答える
3206 参照

java - Apache Commons Exec を使用してコマンドに複数の入力を提供し、出力を抽出する際の問題

Apache Commons Exec ライブラリを使用して、外部コマンド ライン アプリケーションを使用する必要がある Java アプリケーションを作成しています。実行する必要があるアプリケーションの読み込み時間がかなり長いため、毎回新しいプロセスを作成するのではなく、1 つのインスタンスを維持することが望ましいでしょう。アプリケーションの仕組みは非常にシンプルです。開始すると、新しい入力を待機し、出力としてデータを生成します。どちらもアプリケーションの標準 I/O を使用します。

つまり、CommandLine を実行してから、PumpStreamHandler を 3 つの別個のストリーム (出力、エラー、および入力) で使用し、それらのストリームを使用してアプリケーションと対話するという考えになります。これまでのところ、1 つの入力と 1 つの出力があり、その後アプリケーションがシャットダウンするという基本的なシナリオでこの作業を行いました。しかし、2 番目のトランザクションを実行しようとするとすぐに、問題が発生します。

CommandLine を作成した後、Executor を作成し、次のように起動します。

次に、3 つの異なるスレッドを起動し、それぞれが異なるストリームを処理します。入力と出力を処理する 3 つの SynchronousQueues もあります (1 つは入力ストリームの入力として使用され、1 つは新しいコマンドが起動されたことを outputQueue に通知するため、もう 1 つは出力用です)。たとえば、入力ストリーム スレッドは次のようになります。

while ループを削除してこれを 1 回だけ実行すると、すべてが完全に機能するように見えます。明らかに、もう一度実行しようとすると、PumpStreamHandler は 2 つの異なるスレッドからアクセスされているため、例外をスローします。

ここでの問題は、スレッドが終了するまで processInput が真にフラッシュされないように見えることです。デバッグ時に、コマンド ライン アプリケーションは、スレッドが終了して初めて実際に入力を受け取りますが、while ループが保持されている場合は入力を受け取りません。processInput をフラッシュするためにさまざまなことを試しましたが、何も機能していないようです。

誰かが以前に似たようなことを試みたことがありますか? 不足しているものはありますか?どんな助けでも大歓迎です!

0 投票する
4 に答える
24365 参照

java - apache-commons exec からの出力を処理する

私はここで頭がいっぱいです。これは単純なことだと確信しており、Java とストリームの理解に大きな穴がある可能性が高いです。非常に多くのクラスがあるため、API を調べて、多数の入出力ストリームをいつどのように使用するかを把握するのに少し圧倒されていると思います。

apache commons ライブラリの存在を知ったばかりで (Java の自己学習は失敗します)、現在、Runtime.getRuntime().exec の一部を変換して commons を使用しようとしています - exec. 6 か月に 1 回発生するこの問題の一部はすでに修正されており、exec のスタイルの問題は解消されています。

このコードは perl スクリプトを実行し、スクリプトの実行中にスクリプトからの stdout を GUI に表示します。

呼び出しコードは、swingworker の内部にあります。

pumpStreamHandler の使用方法がわかりません... とにかく古いコードは次のとおりです。

これは、ずっと前に完全には理解できなかったコピーペーストコードに対して得られるものだと思います。上記はプロセスを実行していると仮定し、出力ストリームを取得して(「getInputStream」を介して)、バッファリングされたリーダーに配置し、バッファが空になるまでそこでループします。

私が得られないのは、ここで「waitfor」スタイルのコマンドが必要ない理由です? バッファが空になり、ループを終了し、プロセスがまだ進行している間に続行する時間がある可能性はありませんか? 実行すると、そうではないようです。

いずれにせよ、私は commons exec を使用して同じ動作を得ようとしています。

pumpstreamhandler が何をしているかを把握しようとしています。これは exec オブジェクトからの出力を取得し、OutputStream に perl スクリプトの stdout/err からのバイトを入力します。

もしそうなら、どのように上記の動作を取得して、出力を行ごとにストリーミングしますか? 例では、最後に out.toString() を呼び出すことを示していますが、スクリプトの実行が完了すると、スクリプトからのすべての出力のダンプが得られると思いますか? 行ごとに実行されているときに出力が表示されるようにするにはどうすればよいですか?

------------ 今後の編集 ----------------------

Google経由でこれを見つけて、同様にうまく機能します: