問題タブ [processbuilder]

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 投票する
2 に答える
4397 参照

java - Java7でProcessBuilderを使用してプロセスパイプを構築する

私は、新しいを使用してJavaでいくつかのプロセスをパイプする方法を理解しようとしてきましたProcessBuilder。自分がやりたいことの適切な例を見つけることができず、自分でやろうとすると、プロセスがハングします。cat test.txt | wcと同等のコードを実行するが、シェルを介さないコードの非常に単純な例をいただければ幸いです。

- アップデート -

わかりやすくするために。ストリームの読み取りと書き込みによってパイプをシミュレートする方法があることを私は知っています。これは、Java7で導入されたredirectInputメソッドとredirectOutputメソッドによって自動的行われるのではないかと思います。

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

java - Javaプロセスはgpg.exeからInputStream、OutputStreamをキャプチャできません

gpg.exe --passphrase-file my.passphrase --decrypt --output MTR241_20111124.htm MTR241_20111124.htm.gpg(--batchおよび--yesオプションなしで)を使用して復号化しようとしています。誰かがテストに使用したい場合は、暗号化コマンドも提供していますgpg.exe --passphrase-file ..\BE\src\my.passphrase --symmetric --output MTR241_20111124.htm.gpg MTR241_20111124.htm

2つのケースがあります。ケース1:MTR241_20111124.htmファイルが出力ディレクトリに存在しません。コマンドプロンプトとexecのキャプチャされた出力ストリームの両方が同じ出力を提供します。

同じメッセージがjavaexecとコマンドプロンプトによって出力されます。

これまでのところ十分です

ケース2:コマンドプロンプトで期待どおりに出力ファイルがすでに存在する場合、置換するかどうかを尋ねられました。

しかし、この出力は、この最初の行の後にハングするJavaプログラムからのものです。コンソールに行を印刷しません。コンソールに「y」と入力すると、入力と処理が受け入れられません。単にハングします。プロセスtaskkill/F / IM gpg.exeを手動で強制終了する必要があるのは、Javaコンソールプログラムがさらに多くのコマンドとプロセスを受け入れる場合のみです。

もちろん、通常のインタラクティブコマンドは機能します。

したがって、既存の出力ファイルを置き換えるかどうかのプロンプトを要求された場合にのみ、gpgの出力ストリームのキャプチャに失敗するのはなぜですか。

私はすでにRuntime.exec()、ProcessBuilder、Plexus-Utils、ExpectJ、Antを試し、Javaプログラム内でこのgpg.exeを実行しました。これらはすべて、同じ結果がその特殊なケースでプロセスの出力ストリームをキャプチャできないことを示しています。実行するために.batファイルを書き込もうとしましたgpg --decryptが、それでも上記の特殊なケースでは出力ストリームをキャプチャできません。

重要なのは、gpg.exeの起源だと思います。ポータブルgitディストリビューションで入手しました。binフォルダーにgpg.exeがあります。

私の質問は本当に長くて退屈になりましたが、それでもエラーを指摘したい人のためにjavaコード

このgpg --batchオプションを使用すると、y/N入力を求めるプロンプトが表示されなくなるため、スムーズに実行されます。しかし、私は知りたいのですが、なぜこの問題があるのでしょうか。gpg.exeはもともとUnix/Linuxのようなプラットフォーム用に書かれているような気がしますが、入出力ファイルのリダイレクトがあるかもしれませんが、その根本的な原因についてもっと知りたいので、次回は何を知っていますか?探す。

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

java - java.io.IOException: エラー=11

Java で奇妙な問題が発生していますProcessBuilder。コードを以下に示します (少し簡略化した形式で)。

what.sh の読み取り:

のインスタンスのロードは、固定サイズ (35) の にWhatever送信されます。ExecutorServiceアプリケーションの残りの部分は、CountdownLatch. 次の例外をスローする前に、すべてが数時間 (Scientific Linux 5.0、Java バージョン "1.6.0_24") 正常に実行されます。

これが何を意味するのか誰にも分かりますか?の google/bing 検索結果に基づくとjava.io.IOException: error=11、これは最も一般的な例外ではなく、完全に困惑しています。

あまりにも多くのスレッドが同時に同じファイルを起動しようとしているというのは、私のワイルドであまり知識のない推測です。ただし、問題を再現するには数時間の CPU 時間がかかるため、これより少ない数値では試していません。

どんな提案でも大歓迎です。

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

java - ProcessBuilder で作業ディレクトリを設定する方法

ubuntu のホーム ディレクトリでプロセスを開始しようとしています。アクセス許可拒否の例外が発生し続けますが、その理由がわかりません。コードは次のとおりです。

例外は次のとおりです。

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

java - 起動後に親が破棄されない場合、Java process.start が極端に遅くなる

コマンド ラインから特定のプロセスを直接開始すると、2 ~ 3 秒で完全に開始されます。

Java プログラムからまったく同じコマンドを使用してまったく同じプロセスを開始すると、親が破棄されない限り、開始時にハングします。なんで?

ProcessBuilder の場合:

Runtime.exec の場合:

いずれにしても、新しい Process オブジェクトを null に設定せず、すぐにガベージ コレクターを呼び出さないと、新しいプロセスは 3 秒で実行する必要があるのと同じことを実行するのに最大 3 分かかります。

上記のコードを使用すると、問題が修正されます。誰かが私に理由を説明できますか? プロセスが処理するJVMに関連するものだと思いますが、それは単なる推測です。

新しいプロセスは、Hibernate を使用して MySQL DB に接続し、log4j でログファイルを書き込み、.properties ファイルから読み取り、RabbitMQ サーバーに接続します。

ありがとうございました、

ごきげんよう

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

java - Java を使用して MySql からの大きなデータを処理する

Java を使用して MySql から大きなデータを処理する最良の方法はどれですか。私は検索しましたが、最善の解決策を見つけることができませんでした。

要因を考慮してください -

  1. 処理中にテーブルをロックしたい。
  2. 試してみましたが、ほとんどのProcessbuilder場合投げています。"java.io.IOException: error=12, Cannot allocate memory"
0 投票する
1 に答える
1376 参照

java - ProcessBuilder のトラブル

上記のプログラムは、次の例外をスローします。

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

java - 出力を消費せずにプロセスを起動する

この行を使用して、Java アプリケーションから Python スクリプトを実行しました。

このスクリプトは、Java アプリや他のクライアントと通信する TCP サーバーを実行します。

スクリプトをデバッグしていたとき、あちこちにいくつかのコンソール プリントがあり、すべて問題ありませんでした。スクリプトが Java Code から起動されるとすぐに、TCP サーバーが一定時間応答しなくなりました。しばらくデバッグとフラストレーションを感じた後、スクリプトからプリントを削除したところ、すべてが期待どおりに機能しました。

プロセスの標準出力とエラー ストリームにメモリが割り当てられているようです。それを消費しないと、フル バッファに書き込もうとしてプロセスがスタックします。

標準出力ストリームを消費する必要がないようにプロセスを起動する方法は? デバッグのために出力を保持したいのですが、必要のないストリームを読み取るスレッドを開始したくありません。

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

java - 32 ビット JVM、ProcessBuilder.start()、および ENOMEM

私が対処しなければならない 1 つのアプリケーションは、ProcessBuilder. 理由は語られていませんが、基盤となる OS が 64 ビット (RHEL 5.x の価値がある) であっても、32 ビット JVM (Sun、1.6.0.25) で実行されます。

このアプリケーションはメモリを多用するため、ヒープ サイズは最大 3 GB に設定され、permgen は 128M です。

ただし... ランダムな瞬間に、シェル ヘルパーの起動に失敗します。OutOfMemory が原因ではなく、ENOMEM が原因です... これについて私が確認できる唯一の原因は、アドレス空間の不足です。

確かに、しかし同時に、メモリは実際には圧迫されておらずtop、JVM とその仮想セットのサイズの実際のメモリ使用量は 3 GB でさえないことが報告されています...

のコードを見ることができるものProcessを見ると、コア メソッドが呼び出されてforkAndExec()いることがわかります。これは、ほとんど自明です...両方のシステムコールについて知っていることから、失敗するべきではありません。しかし、そうです。そして、常にではありません。

なんで?

編集:neo4jが使用されていることに注意してください。FileChannel を多用しているようですが、それがアドレス空間不足の原因でしょうか?

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

java - Java、Runtime.exec、または ProcessBuilder: ファイルがシェルかバイナリかを知る方法は?

私は決定するための最も効率的な方法を検討しています:

  • ユーザー提供のコマンドラインの前にシェル実行可能ファイルを追加する必要がありますか
  • はいの場合、その実行可能ファイルは何ですか? (/bin/sh? /usr/bin/perl? /usr/bin/ksh? c:/../cmd.exe?)

Java からシェル スクリプトを開始するには、代わりにシェルを開始する必要があることが知られています。

バイナリを開始するには、バイナリ自体を開始する必要があります。

シェルでバイナリを実行すると、次のエラーが発生します。

シェル バイナリなしでシェル スクリプトを実行すると、次のエラーが発生します。

アプリケーションがバイナリかスクリプトかを認識できない状況に陥っています。

開始されたアプリケーションは、エンド ユーザーによって提供されるイベント ハンドラです。Unix で実行されるシェル スクリプトである可能性が最も高いです。ただし、Windows では *.cmd である場合もあれば、あいまいなプラットフォームで実行される Perl スクリプトである場合もあります。結局のところ、それは Java です。

私の最初の素朴な試みは、シェルでコマンドラインを開始し、それが機能するかどうかを確認することでした. そうでない場合は、バイナリとして実行してみてください。

これは見苦しく危険です。プラットフォームとシェルの未知の組み合わせでは、2 回目の実行でもスクリプトが実行され、2 回目の結果が予測不能になる可能性があります。

また、スクリプトを開始できなかったときから、スクリプト自体の問題が原因でスクリプトがいつ正常に開始され、失敗したのかわかりません。

私が今考えている最善のことは次のとおりです。

  • スクリプトを読み、印刷できないバイトを探します
  • 見つかった場合は、バイナリと見なします
  • そうでない場合は、/bin/sh (Windows の場合は cmd.exe) を追加します。

何か良い案があればアドバイスお願いします。

更新/部分的な解決

私と考えを共有してくれたすべての人に感謝します。

結局、私は自分自身とインターネットの残りの部分を混乱させました:)

次の場合、ユーザーが入力したコマンド ラインの前に、shall バイナリを追加する必要はありません。

  1. スクリプトはPATHにあります
  2. (Unix の場合) スクリプトは実行可能です
  3. (Unix の場合) スクリプトには #!/path/to/interpreter があります

コードをテストしているときに、これらの条件のいずれかが満たされませんでした。:-(

スクラッチスクリプトから慎重にテストを実行した後、実行されました。

ポイント 3 はユーザーのみが行うことができ、ユーザー マニュアルに記載する必要があります。

これらのスクリプトがターゲット システムに伝達される方法が原因で、スクリプトが実行可能でなく、PATH に含まれていない場合があります。

私が気にする唯一のパスは相対パスなので、相対パスの前に ./ を追加するだけで十分です。

Unix (およびその他のプラットフォーム) でスクリプトを実行可能にすることは、さらに困難です。WORAではありません。その前に /bin/sh を配置すると役立つ場合がありますが、覚えている限り、Solaris のすぐ下では、シェルは実行不可能なスクリプトを実行しません。

今週後半に別の更新を投稿します。