問題タブ [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 - Process Builder の waitFor() の問題とオープン ファイルの制限事項
私はいくつかのコードを継承しました:
基本的に、キーと値のペアをファイルとしてディスクに保存するのには、古くからブードゥー教に基づいた理由があります。私は本当にそれに入りたくありません。
ただし、IO 例外が多数残っています。
そして、私が意味する束とは、10,000〜数百万の領域を意味します
waitFor 呼び出しは、プロセスが完了して終了するのを待ってこれらの発生を停止するためのものだと感じましたが、ファイルが実際に閉じられる前に chmod が結果を返していると思います。それがこれらの例外の原因であるかどうかは誰にもわかりますか?
私のもう1つの傾向は、Java側で何千ものファイルの開閉が十分に迅速に行われておらず、何か他のことが起こっていることです. fw.close() が呼び出されています。
私はJavaにかなり慣れていませんが、これは私を困惑させた奇妙なものでした。(幸いなことに、アプリはまだ何らかの形で実行されています..非常に大きなログファイルを吐き出した後です)
他の誰かがこれを回避する方法を考えることができますか、バッファをクリアするか、ファイルのオープン制限をjvmがそれ自体に追いつくことができるものに増やします(それが問題であると仮定します)
java - スレッドと ProcessBuilder の使用
私はスレッドの操作に本当に慣れていないので、誰かがこれを行うための最良の方法を見つけるのを手伝ってくれることを望んでいました.
Java アプリケーションに JButton があります...ボタンをクリックすると、外部の Python コードを実行するプロセスを作成する Process Builder があります。Python コードはいくつかのファイルを生成しますが、これには時間がかかる場合があります。Python コードの実行が完了したら、それらのファイルを Java アプリケーション内のアプレットにロードする必要があります。
現在の形式では、外部の python ファイルを呼び出すコード内に p.waitFor() があります...そのため、ボタンをクリックすると、プロセスが完了するまでボタンがハングします (アプリケーション全体が実際にハングします)。明らかに、このプロセスの実行中にユーザーがアプリケーションの残りの部分と対話できるようにしたいのですが、プロセスが完了したらすぐにアプリケーションにそれを知らせて、ファイルをアプレットにロードできるようにしたいと考えています。 .
これを行う最善の方法は何ですか?
ご協力いただきありがとうございます。
java - ProcessBuilder を使用して Jar で実行可能ファイルを実行する
ProcessBuilder を介して呼び出す非 Java 実行可能ファイルを使用する、作成したアプリケーションがあります。
ProcessBuilder pb = new ProcessBuilder(invocation);
pb.redirectErrorStream(true);
Process proc = pb.start();
InputStream is = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
ただし、そのアプリを外部の同じディレクトリに配置するのではなく、jar ファイル自体にきちんとバンドルしたいと考えています。このアプリを解凍せずに実行する方法はありますか?
ProcessBuilder を削除する必要がある場合は、それが機能する限り問題ありません。:)
java - Java プロセス間でオブジェクトを共有する
メイン アプリケーションから別の JVM (java.exe) を実行しています。オブジェクト(かなり大きなオブジェクト)を新しく作成されたプロセスと共有する方法はありますか(作成時または作成後)。
ここで、sO オブジェクトを proc オブジェクトによって示されるプロセスで使用できるようにします。
ProcessBuilder は、この目的のためのユーティリティを提供していますか?
java - Java ProcessBuilder: 外部プロセスがハングする
Java の ProcessBuilder クラスを使用して外部プロセスを実行しています。プロセスは、Java プログラムが終了する前に終了してはなりません。コマンド/応答モードで存続する必要があります。
プロセス ストリームは無視すると簡単に「ジャム」する可能性があることを知っているので、次のことを行いました。 プログラムは、プロセスの結合された出力ストリームとエラー ストリームを「リーダー」スレッドで読み取り、「ライター」スレッドを使用してコマンドを管理します。 . リーダー スレッドは、プロセス出力からの文字読み取りをブロックし、それらを文字列にバッファリングして、結果をディスパッチします。書き込みスレッドは、PrintWriter を介して完全な「コマンド」行を書き込みます。キューを使用して、2 つのコマンド書き込みが「近すぎ」(現在は 100 ミリ秒) ないようにし、前のコマンドの出力が完了する前に新しいコマンドが書き込まれないようにします。また、すべての println() の後に、flush() と checkError() を呼び出します。
このスキームは、数秒または数分間正常に機能し、その後、読み取りスレッドがブロッキング read() でハングします。エラーも例外もスローされず、プロセス出力もありません。その後、外部プロセスを復活させるものは何もありません(再起動する以外)。(ところで、これは Linux と Windows の両方で発生します。)
Jakarta Commons Exec と Plexus Utils http://plexus.codehaus.org/plexus-utils/のコードとテストケースを見てきましたが、(a) どちらも長寿命のプロセスを使用する例を示しておらず、( b) どちらも、私が説明したことと基本的に異なることをしているようには見えません。
ここで何が起こっているのか、誰にも分かりませんか?ありがとう!
java - 起動したJavaアプリケーションのコンソールを表示するJava ProcessBuilder?
次のような別の Java アプリケーションを (ProcessBuilder を使用して) 起動する Java アプリケーションがあります。
これで問題なく動作し、appName はパラメータ val で起動され、実行されて動作します...素晴らしいです...問題はコンソール ウィンドウが表示されないことです...appName はコンソールに多くの出力を行いますが、それを確認する必要があります...コンソールでプロセスを開始するにはどうすればよいですか?
("CMD.exe"、"java"、"-classpath"、dir、appName、val) などを試していますが、うまくいきません ...
また、ストリームをリダイレクトできません。私のプログラムは実際にこれらの appName の 5 ~ 10 個を開始できます。それぞれに独自の情報を表示する独自のコンソール ウィンドウが必要です。
どんな助けでも大歓迎です。ありがとう、
jvm - JVM からの bash スクリプトの実行
Java から簡単な bash スクリプトを実行できません。具体的には:
...
... ここで、'command' はすべて実行可能な bash スクリプトへの絶対パスであり、'dir' は作業ディレクトリです。
プログラムを実行すると、終了コード 127 (「コマンドが見つかりません」) が表示されます。Java ランタイム クラスと process.exec メソッドを使用してみましたが、どちらもうまくいきませんでした。助言がありますか?
java - シェルで同じものを実行するのとは異なるJavaProccesBuilderを介してコマンドを実行する
ProcessBuilderとProcessを使用してJava経由で実行しているコマンドが機能しない理由を解明しようとして、髪の毛を引き裂いています。Windowsのコマンドラインで「同じ」コマンドを実行すると、期待どおりに機能します。それらは同じではないに違いありませんが、私は一生の間、その理由を理解することができません。
コマンドは次のとおりです。
出力は、取得して環境変数として設定する必要がある1行の文字列である必要があります(したがって、v。の基本的な使用法BufferedReader
)。
コマンドを実行するとアプリケーションエラーが発生する私のJavaコードは、次のようになります。エントリポイントは次のstartCCMAndGetCCMAddress()
とおりです。
の出力System.err.println(...)
は次のとおりです。
java - System.exit() の後も Java が実行され続ける原因は何ですか?
ProcessBuilder
別の Java プログラムから
起動されている Java プログラムがあります。System.exit(0)
子プログラムから呼び出されますが、一部のユーザー (Windows 上) ではjava.exe
、子に関連付けられたプロセスが終了しません。子プログラムにはシャットダウン フックがなく、VM の終了をSecurityManager
停止する可能性のあるもありません。System.exit()
Linux または Windows Vista で問題を自分で再現できません。これまでのところ、この問題に関する報告は、2 つの異なる JRE (1.6.0_15 と 1.6.0_18) を使用している 2 人の Windows XP ユーザーと 1 人の Vista ユーザーからのものだけですが、彼らは毎回問題を再現することができます。
System.exit()
の後に JVM が終了せず、一部のマシンでのみ終了する理由を誰かが提案できますか?
編集 1:問題のある VM からスレッド ダンプを取得できるように、ユーザーに JDK をインストールしてもらいました。ユーザーが私に言ったのは、メニューの「終了」項目をクリックするとすぐに VM プロセスが VisualVM から消えるということですが、Windows タスク マネージャーによると、プロセスは終了していません。ユーザーが (分、時間) 待機しても、終了することはありません。
編集 2:Process.waitFor()
親プログラムでは、問題を抱えているユーザーの少なくとも 1 人に対して決して返らないことを確認しました。要約すると、子 VM は停止しているように見えますが (VisualVM はそれを認識していません)、親はまだプロセスを稼働中であると認識しており、Windows も同様です。