問題タブ [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.
java - WindowsでJavaでCMDファイルを正しく呼び出す方法は?
以下のようなサンプルJavaコードがあります。
test.cmd には、実際には別の Java アプリケーションへの呼び出しがあります。$$ でマークされた行を次のように変更して出力をリダイレクトしない限り、別の Java アプリを起動できません。
何かアイデアはありますか?前もって感謝します。:)
java - プロセスの入力ストリームから読み取り、指定されたメソッドを使用して処理するためのより良い方法はありますか?
私は次の作業を行うプログラムを書いています。
- ProcessBuilderを使用してコマンドを実行します(「svninfo」や「svndiff」など)。
- プロセスの
getInputStream()
;からコマンドの出力を読み取ります。 - コマンドの出力で、私は次のいずれかが必要です。
- 出力を解析し、必要なものを取得して後で使用する、または:
- 指定されたファイルに出力を直接書き込みます。
今私がしているのはBufferedReader
、コマンドが出力するものをすべて行で読み取り、それらをに保存してからArrayList
、行をスキャンして何かを見つけるか、ファイルに行を書き込むかを決定することです。
コマンドの出力をファイルに保存する場合はArrayListは必要ないため、これは明らかに醜い実装です。それで、あなたはそれをより良い方法で行うために何を提案しますか?
これが私のコードのいくつかです:
これを使用してコマンドを実行し、プロセスの出力から読み取ります
そして1つの方法で私はこのようにするかもしれません:
そして別の場合、私はこのようにするかもしれません:
java - ProcessBuilder.start() によりホスト JVM が終了する
クライアントとサーバー JVM があるネットワーク アプリケーションを開発しています。どちらも、同じ場所に格納されている場合と格納されていない場合があります。サーバーに接続した直後に、クライアントはその jar の MD5 Sum をサーバー上の jar と比較します。MD5 サムが一致しない場合、クライアントはサーバーの jar を新しいフォルダーにダウンロードしProcess
、クライアントが現在使用しているどの jar にも依存しない新しいフォルダーを生成しようと試みてから終了します。この新しいProcess
ものは、クライアントが上記の新しいフォルダーに保存したサーバーからのコピーでクライアントのjarを上書きし、終了することになっています。
問題は、クライアントが新しいプロセスを起動しようとするたびに、クライアントの JVM がサイレントに終了することです。新しい を生成するコードは次のProcess
とおりです。
クライアントは への呼び出しで終了しているように見えますpb.start()
。私のプログラムのコンソール出力は次のとおりです。
後のprintステートメントはpb.start()
決して呼び出されません。私はこれを Java 6 と Java 7 の両方でテストしましRuntime.getRuntime().exec()
た。誰もこのようなものを見たことがありますか?
java - javaで開始されたnoguiプロセスのコンソールウィンドウを作成するにはどうすればよいですか?
Java で GUI を使用せずにプロセスを開始すると、コンソール ( cmd.exe
) ウィンドウが開きません。
例:
コンソール ウィンドウを表示するにはどうすればよいですか?
java - Java プロセスの inputStream スタック
これが私のシナリオです:
- プロセス A は子プロセス B を生成し、スレッドをスピンして B の出力をドレインします。
- プロセス B はデーモン プロセス C を生成し、その出力も排出します。
- プロセス B が終了しても、デーモン プロセスは存続します。
- プロセス A は、プロセス B が process.waitFor() を介して終了したことを検出します。ただし、プロセス B の入力ストリームの読み取りでスタックしています。これは、B がデーモンを開始したためです。入力ストリームは、プロセス C が終了したときにのみ EOF を受け取ります。
これは Windows でのみ発生します。ProcessBuilder を使用しています。私が思いついた解決策は次のとおりです。私が本当に気に入っている解決策はありませんので、フィードバックをお寄せください。
- jna を使用してデーモン プロセス C を生成できます。このようにして、「十分に切り離された」プロセスを作成でき、プロセス A は B からのストリームの排出に固執しません。それは機能しますが、私はその解決策にあまり熱心ではありません。それはいくつかのネイティブ コードを意味します (そして、私は入力を消費することに熱心なので、その多くを意味します)。JNAを介してそれを行う方法のインスピレーションは、http: //yajsw.sourceforge.netにあります(ただし、単なるプロセス開始よりもはるかに多くのものが含まれています)。
- jre7 で実行します。Jdk7 は ProcessBuilder にいくつかの新しい機能をもたらします。たとえば、私の問題も解決する inheritIO() などです。どうやら、inheritIO() がオンになっていると、デーモン プロセス C のすべてのストリームを単純に閉じることができ (これはデーモンなのでとにかくそうします)、問題は解決します。ただし、jre5+で実行する必要があります
- デーモン プロセス C を生成する前に、プロセス B の System.out と System.err を閉じます。これで問題は解決しますが、これらのストリームに有用なものを書き込むため、プロセス B でこれらのストリームを動作させる必要があります。ダメ。B と C の間にある種のブートストラップ プロセスを配置することで、この特性を利用できることを望んでいましたが、問題は解決しませんでした。
- Linux ではその問題は発生しないので、Linux でのみ実行できますか? いいえ、できません。
- プロセスAがプロセスBの出力をブロックしない方法で排出するようにしました。これはある程度機能しますが、便利ではありません。たとえば、inputStream.read() は中断できません。inputStream.available() を使用できますが、EOF と zero-bytes-available を区別しません。したがって、プロセス A が B の出力 EOF に関心がない場合にのみ、解決策は適切です。また、このソリューションはより CPU を集中的に使用するようであり、一般的には... ぎこちなく、防弾とは言えません。
- プロセス C を --dry-run モードで実行します。このモードでは、開始できるかどうかを確認するだけです。起動を試み、ウェルカム メッセージを送信して終了します。長時間実行されなくなったため、読み取りをブロックしません。プロセス B は、C を開始できるという十分な信頼を得ることができ、比較的単純な JNA コードを使用して、その出力を消費せずに切り離されたプロセスを生成できます (出力を消費すると、JNA 関連のコードが煩雑で重くなります)。唯一の問題は、C の出力をコンシューマ処理しなくなったことですが、プロセス B がコンシューマできる既知のファイルに C を書き込むことで解決できます。このソリューションは、大きくて醜い回避策のようなものですが、私たちにとっては実行可能です. とにかく、私たちは解決策 1) を現在試しています。
ヒントをいただければ幸いです。
java - JavaのProcessBuilderでexeファイルを実行できません
次のようにいくつかのパラメーターを設定しながら、exeファイルを実行しようとしています。
コマンドラインから実行すると、完全に機能します。しかし、Java コードから実行しようとすると、プロセスが開始されますが、しばらくすると応答しなくなるため、強制的に閉じる必要があります。私はこのJavaコードを使用しています:
私が間違っていることはありますか?
java - Javaからデーモンを起動する
Javaからデーモンを起動することは可能ですか?具体的には、JavaでMongoDBを使用しようとしていますが、アプリケーションがまだ実行されていない場合は、アプリケーションでmongodデーモンを起動する必要があります。正常に起動できるようです。exitcodeは0です。ただし、常にすぐに終了します。強制的に実行を継続してから、proc.destroy()で終了することは可能ですか?
ProcessBuilder pb = new ProcessBuilder("./bin/mongod","--dbpath data/db");
Process proc = pb.start();
プロセスの開始後にブレークポイントを設定した場合、hasExistedブール値は常にtrueであり、終了コードは0であり、接続できません。
また、これはOS X 10.5にあります、私はProcessBuilderがOS全体で気難しいことを知っています
java - 優先度の低いプロセスを (Runtime.exec / ProcessBuilder.start を使用して) 開始する
サーバーの速度が低下しないように、CPU を集中的に使用するシステム プロセスを低い優先度で開始する必要があります。Linuxでこれを行うにはどうすればよいですか?
これは次の質問に似ています: Runtime.exec / ProcessBuilder.start を使用して低優先度で Java プロセスを開始しますか? ただし、Windows ではなく Linux を除きます。プロセスの開始後にプロセスの優先度が変更されても問題ありません (遅延が大きくない限り)。
java - ProcessBuilder のデバッグ
実行可能な jar を作成し、別の Java プログラムのプロセス ビルダーを使用して実行しました。ここに私のコードがあります -
}
私は今、Eclipseからsrc.jarをデバッグしようとしています。デバッグ構成でプロジェクト src を外部プロジェクトとして提供しましたが、それでもブレークポイントにヒットしません。このようなデバッグ環境をセットアップする方法はありますか?
java - ProcessBuilder のトラブル
次のコードは、メモ帳でステータスを非常にうまく開きます。
次のコードは曲を再生しません: