問題タブ [child-process]

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

java - Java プロセスの inputStream スタック

これが私のシナリオです:

  1. プロセス A は子プロセス B を生成し、スレッドをスピンして B の出力をドレインします。
  2. プロセス B はデーモン プロセス C を生成し、その出力も排出します。
  3. プロセス B が終了しても、デーモン プロセスは存続します。
  4. プロセス A は、プロセス B が process.waitFor() を介して終了したことを検出します。ただし、プロセス B の入力ストリームの読み取りでスタックしています。これは、B がデーモンを開始したためです。入力ストリームは、プロセス C が終了したときにのみ EOF を受け取ります。

これは Windows でのみ発生します。ProcessBuilder を使用しています。私が思いついた解決策は次のとおりです。私が本当に気に入っている解決策はありませんので、フィードバックをお寄せください。

  1. jna を使用してデーモン プロセス C を生成できます。このようにして、「十分に切り離された」プロセスを作成でき、プロセス A は B からのストリームの排出に固執しません。それは機能しますが、私はその解決策にあまり熱心ではありません。それはいくつかのネイティブ コードを意味します (そして、私は入力を消費することに熱心なので、その多くを意味します)。JNAを介してそれを行う方法のインスピレーションは、http: //yajsw.sourceforge.netにあります(ただし、単なるプロセス開始よりもはるかに多くのものが含まれています)。
  2. jre7 で実行します。Jdk7 は ProcessBuilder にいくつかの新しい機能をもたらします。たとえば、私の問題も解決する inheritIO() などです。どうやら、inheritIO() がオンになっていると、デーモン プロセス C のすべてのストリームを単純に閉じることができ (これはデーモンなのでとにかくそうします)、問題は解決します。ただし、jre5+で実行する必要があります
  3. デーモン プロセス C を生成する前に、プロセス B の System.out と System.err を閉じます。これで問題は解決しますが、これらのストリームに有用なものを書き込むため、プロセス B でこれらのストリームを動作させる必要があります。ダメ。B と C の間にある種のブートストラップ プロセスを配置することで、この特性を利用できることを望んでいましたが、問題は解決しませんでした。
  4. Linux ではその問題は発生しないので、Linux でのみ実行できますか? いいえ、できません。
  5. プロセスAがプロセスBの出力をブロックしない方法で排出するようにしました。これはある程度機能しますが、便利ではありません。たとえば、inputStream.read() は中断できません。inputStream.available() を使用できますが、EOF と zero-bytes-available を区別しません。したがって、プロセス A が B の出力 EOF に関心がない場合にのみ、解決策は適切です。また、このソリューションはより CPU を集中的に使用するようであり、一般的には... ぎこちなく、防弾とは言えません。
  6. プロセス C を --dry-run モードで実行します。このモードでは、開始できるかどうかを確認するだけです。起動を試み、ウェルカム メッセージを送信して終了します。長時間実行されなくなったため、読み取りをブロックしません。プロセス B は、C を開始できるという十分な信頼を得ることができ、比較的単純な JNA コードを使用して、その出力を消費せずに切り離されたプロセスを生成できます (出力を消費すると、JNA 関連のコードが煩雑で重くなります)。唯一の問題は、C の出力をコンシューマ処理しなくなったことですが、プロセス B がコンシューマできる既知のファイルに C を書き込むことで解決できます。このソリューションは、大きくて醜い回避策のようなものですが、私たちにとっては実行可能です. とにかく、私たちは解決策 1) を現在試しています。

ヒントをいただければ幸いです。

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

c# - C# から新しい explorer.exe プロセスを開始する

このコマンドを実行すると:

Windows シェルから ( Windows+経由Rで)、プリンターとファックスが新しい explorer.exeプロセスで開きます。(したがって、2つの実行中のexplorer.exeプロセスがあります。)

私が実行した場合:

C#プログラムから、プリンターとファックスも開きますが、メインexplorer.exeプロセス(タスクバーなどを含むWindowsシェルを実行するプロセス)の子プロセスとして開きます。

explorer.exeC# からプリンターとファックス ウィンドウで2 番目のプロセスを開始するにはどうすればよいですか?

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

bash - bashのトラップを使用して終了したバックグラウンドプロセスのpidをキャプチャします

いくつかのバックグラウンドプロセスを生成するbashスクリプトを書いています。プロセスが終了するたびに通知を受け取りたいのですが。終了したプロセスのpidを知りたいのですが。

waitスポーンされた各プロセスのpidがキャプチャされて配列に格納され、配列が繰り返され、各プロセスで待機が呼び出されるように、を使用することを検討しました。この手法は、ここでさまざまな方法で説明されています。

https://stackoverflow.com/a/356154/366856

これに関する問題は、私が正しく理解していれば、個々のプロセスが終了したらすぐに何らかのアクションを実行したい場合、比較的非効率になる可能性があることです。たとえば、プロセスAとBを生成し、BがAの前に終了した場合、実行はAとBの両方が終了するのを待つ必要があります。Bが終了したらすぐにアクションを実行する必要があります。

子が終了したらすぐにアクションを実行する方法のようtrap SIGCHLDですが、問題は、SIGCHLD信号のソースのpidを判別する方法が見つからないことです。これも必要です。これの実用的な例に私が見つけた最も近いものは、この投稿の3番目のコード例です。

http://www.linuxforums.org/forum/programming-scripting/103996-multithreading-bash.html#post510187

便宜上、ここにコピーして貼り付けました。

この例はうまくいかないと思います。なぜなら、作成者は、引数trapで異なるpid変数をキャプチャするたびに、何度も呼び出すという間違いを犯しているからです。trapトラップが呼び出されるたびに、前の呼び出しが上書きされるため、任意のpidがキャプチャされます。私はより良いテクニックを見つけることができませんでした。

bashのトラップを使用して終了した子プロセスのpidを取得する方法はありますか?

アップデート

私はこのリソースを指摘したかっただけです。このリソースには、これまでに見たこの問題の解決策の最も包括的な概要が含まれています。

http://mywiki.wooledge.org/ProcessManagement#I_want_to_process_a_bunch_of_files_in_parallel.2C_and_when_one_finishes.2C_I_want_to_start_the_next._And_I_want_to_make_sure_there_are_exactly_5_jobs_running_at _

0 投票する
0 に答える
1199 参照

node.js - child_processによって開始されたプロセスのツリーを強制終了するには?

を使用してプロセスを生成する Node.js アプリがありますchild_process.spawn(my_command)。のようなコマンドを実行するために使用しますsudo my-app

sudoプロセスが開始されると、開始されますmy-app。したがって、プロセスのツリーになります。sudo上部に、私のアプリ、下部にあるサーバーなど。

ノードスクリプトから、開始したプロセスをmy_process.kill("SIGTERM")強制終了すると、プロセスは強制終了されsudoますが、その子は強制終了されません。私のサーバーは稼働し続けます。

プロセスのツリー全体を強制終了する方法はありますか?

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

node.js - 出力をバッファリングせずに Node.js からシェル コマンドを実行する

そのコマンドの入力と出力をリダイレクトせずに、Node.js からシェル コマンドを起動しようとしています。シェル スクリプトや Ruby のコマンドを使用してコマンドにシェルを実行するのと同じsystemです。子プロセスが STDOUT に書き込みたい場合は、コンソールに直接送信します (または、Node アプリの出力がリダイレクトされた場合はリダイレクトされます)。

ノードには、これを行う簡単な方法がないようです。別のプロセスを実行する唯一の方法は、子プロセスの入力と出力child_process常にパイプにリダイレクトする を使用することです。これらのパイプからデータを受け取り、それをプロセスの STDOUT および STDERR に書き込むコードを作成することはできますが、そうすると、API によってある程度の柔軟性が犠牲になります。

2 つの機能が必要です。

  • シェル構文。コマンド間で出力をパイプしたり、Windows バッチ ファイルを実行したりしたいと考えています。
  • 無制限の出力。私がコンパイラにシェルアウトしていて、メガバイトのコンパイラ警告を生成したい場合、ユーザーがうんざりして Ctrl + C を押すまで、それらすべてを画面上でスクロールさせたいと思います。

Node は、これら 2 つの機能のどちらかを選択するよう強制したいようです。

  • 無制限の量の出力が必要な場合は、 を使用child_process.spawnして を実行child.stdout.on('data', function(data) { process.stdout.write(data); });し、同じことをstderr. 残念ながら、spawnシェル構文はサポートされていません。
  • シェル構文が必要な場合は、child_process.exec. しかしexec、子プロセスの STDOUT と STDERR をバッファリングし、最後にそれらをすべて渡すことを主張し、それらのバッファのサイズを制限します (構成可能、デフォルトで 200K)。on('data')生成された出力を確認したい場合は、引き続きイベントをフックできますexecが、データもそのバッファーに追加します。データ量が定義済みのバッファ サイズを超えるexecと、子プロセスが終了します。

(柔軟性の観点から、両方の世界で最悪child_process.execFileの もあります。シェル構文はありませんが、期待する出力量を制限する必要があります。)

何か不足していますか?ノードの子プロセスにシェルアウトし、その入力と出力をリダイレクトしない方法はありますか? シェル スクリプトや Ruby などで利用できるように、シェル構文をサポートし、事前に定義された量の出力の後に無駄にならないものはありますか?

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

node.js - nodejsによる子プロセスの出力破壊

ubantuにwavecom GSMモデムを接続 しました。node.js 言語を使用して GSM モデムと通信します。Child Processでモデムにコマンドを送ります。ここに例

ここで、ポート /dev/ttyUSB15 でいくつかのコマンドを起動すると、出力が正しく得られません。

例えば

私の出力が

しかし、それの代わりに私は得ました

要するに、私の出力は壊れています。出力が正確に壊れる場所から推定することはできません。ランダムです。誰でも私にアイデアを教えてもらえますか?

前もって感謝します。

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

php - ソケットサーバーからフォークされたゾンビ子プロセスを終了する

免責事項

この場合、ソケットサーバーにとってPHPが最良の選択ではなかった可能性があることを私はよく知っています。異なる言語/プラットフォームを提案することは控えてください-私を信じてください-私はそれをあらゆる方向から聞いてきました。

Unix環境で作業し、PHP 5.2.17を使用している場合、私の状況は次のとおりです。フラッシュクライアントと通信するソケットサーバーをPHPで構築しました。私の最初の悩みは、各着信接続が処理が完了するまで順次接続をブロックすることでした。PHPを利用してこれを解決pcntl_fork()しました。他のクライアントへのメッセージのブロードキャストを処理する多数の子プロセス(親にPIDを保存)を正常に生成できたため、親プロセスを「解放」して、次の接続の処理を続行できるようになりました。

現在の私の主な問題は、これらのデッド/ゾンビの子プロセスのコレクションを処理/処理し、それらを終了することです。pcntl_fork()に関連するPHPのマニュアルページを(何度も)読んだところ、親プロセスが子のクリーンアップを担当していることがわかりました。親プロセスは、子がを実行すると、子からSIGNALを受け取りexit(0)ます。シグナルハンドラーpcntl_signal()を設定する関数を使用して、そのシグナルを「キャッチ」することができます。

私のsignal_handlerは次のようになります:

私は確かに、削除する必要がある関連する正しい子PIDを含む両方のエコーを確認していますが、

私が同義であると理解してkill -9 $childPidいるのは、実際にはプロセスを削除していませんが、TRUEを返しています...

のマニュアルページposix_killから取得:

成功した場合はTRUEを返し、失敗した場合はFALSEを返します。


コマンドを使用して子プロセスを監視していpsます。システム上では次のように表示されます。

ご覧のとおり、これらのプロセスはすべて、PIDが5234

私は私の理解に何かが欠けていますか?私はなんとかすべてを機能させることができたようです(そしてそれは機能します)が、システム上に無数のゾンビプロセスが残っています!

ゾンビの黙示録の私の計画は堅実です-しかし、ゾンビの子プロセスを殺さない
場合でも、一体何ができるでしょうか?sudo kill -9


10日後に更新

私はいくつかの追加の調査の後にこの質問に自分で答えました、あなたがまだ私のとりとめのないことに耐えることができるならば、意のままに進んでください。

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

c - 別のCプログラムからのACプログラムのメイン関数の戻り値を確認する方法

ac プログラムが正しくコンパイルおよび実行されたかどうかをテストしようとしています。

ac プログラムでHello Worldを印刷したばかり なので、チェックする ac プログラムを書きたいとします。

最初のプログラムが 0 を返したか、何か他のものを返したこと。

どうやってやるの。

前もって感謝します。

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

javascript - nodejsを介して生成されたプロセスに再接続する

Node.js で小さな独自のゲーム サーバー マネージャーを作成しています。現在、次の方法でスポーンしてゲームを実行しますchild_process

マネージャーが実行し続ける限り、コマンドをパイプして、必要に応じて子を処理できます。ただし、マネージャーがクラッシュしたり閉じたりする可能性を考慮してください。 次に、以前に生成された子プロセス (マネージャーがダウンしている間も実行されていた) に再接続するにはどうすればよいですか? pidfile を保存して、pid に基づいて再接続を試みることができます。child_processしかし、子のオブジェクトにアクセスできるオブジェクトを取得する方法がわかりませんstdio

これが回復可能であることを本当に望んでいます。どんな助けでも大歓迎です、ありがとう!


: ゲーム サーバーはプロプライエタリです。たとえば、Minecraft、ソース DS などがあります。サーバー ソースにアクセスできないと仮定します。


編集

ノードからいくつかのソースコードを読み取った後、オプションで , というプロパティを指定した場合、またはソケットを開く必要child_processがあるように見えます。( 428496行を参照)。したがって、問題は、spawn が実際にspawn を実行するのをどのように停止し、代わりに指定された pid と渡したストリームに基づいてその値を設定するかです。(その fd はパイプとして作成されているので、どちらが機能するかを実行することで取得できます。)stdinStreamstdoutStreamstderrStreamstdinStreamfs.createWriteStream('/proc/PID/fd/0');

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

node.js - Node.jsでchild_processから1行ずつ読み取る方法は?

ディスク使用状況を分析する Node.js スクリプトを作成しようとしています。このために、私は にシェルアウトしduますが、子プロセスからの出力を 1 行ずつ読み取る方法を理解するのに苦労しています。これが私がこれまでに試したことです:

du.stdout.on('data'データのチャンクを読み取るだけでreadline、入力を行ごとに分割する必要があると思われますが、そうではなく、まったく同じデータを取得します(du.stdoutはバッファーを返しますが、.toString()それを呼び出すと、で取得したのと同じデータが得られますlinereader)。