2016-09-16 3 views
0

私はこのような子プロセスを生成するコードがあります。今までノードの子プロセス:常にそれ自身で終了しますか?

const spawn = require('child_process').spawn; 
const ls = spawn('ls', ['-lh', '/usr'], { 
    detached: true 
}); 

ls.stdout.on('data', (data) => { 
    console.log(`stdout: ${data}`); 
}); 

ls.stderr.on('data', (data) => { 
    console.log(`stderr: ${data}`); 
}); 

ls..on('error', (data) => { 
    console.log(`error: ${data}`); 
}); 

ls.on('close', (code) => { 
    console.log(`child process exited with code ${code}`); 
}); 

を、私はstdoutとstderrからのメッセージをコンソールことができ、それが終了した後に自動的にタスクを終了しました。

私の質問は:どのような状況で

  1. は、それが 'エラー' のイベントに行くのだろうか?

  2. 子プロセスが終了できない可能性がありますか?もしそうなら、それはいつ起こるのだろうか?

  3. ケース2が発生した場合、メインプロセスが既に終了している場合、これらの子プロセスを強制終了するにはどうすればよいですか?

+0

明確にする必要がある場合は、自分の回答に関連する質問をしたり、意味がある場合は答えとして回答することはできます。 –

答えて

3
  1. 子プロセスは、いつでもlsコマンド、またはプロセスエラーをエラーになります。したがって/userが存在しなかった場合、プロセスはエラーを起こしてから終了します。 Node内に子プロセスを生成すると、コマンドラインでコマンドを実行した場合と同じように動作します。ほとんどのプロセスはエラーで終了します。それは本当に依存しているだけです。あなたは、LinuxやUnixのドキュメントや、エラーが発生したときに何が起こるかを知るために使用しているOSを調べる必要があります。しかし、これらのシステムレベルのコマンドは死ぬべきですlsのような単純なコマンドでは、かなり安全です。エラーの場合、それは死ぬ。終わり。

  2. 子プロセスが終了しない可能性があります。子プロセスが終了しない時期を正確に言うのは難しいです。さまざまなことが起こる可能性があります。たとえば、いくつかのプロセスをforkしたが、決して閉じなかったり、何らかの理由で子プロセスが何らかの無限ループに陥ったりした場合。いくつかのプロセスは開始されており、無期限に継続することを意図されており、手動でのみ閉じることができます。

  3. ケース2が発生した場合、それを殺す方法はいくつかあります。この例では、ls javascript変数はプロセスを表すオブジェクトを参照します。好奇心のために、lsオブジェクトをコマンドラインに記録し、その中のすべてのプロパティを見ることができます。だから、一般的にspawn()と呼ぶと、この種の子プロセスオブジェクトが返されます。 Nodeでは、プロセスを強制終了する最も簡単な方法は、子プロセスオブジェクトのkill()関数を呼び出すことです。この場合、ls.kill(signal)に電話すると、'SIGINT','SIGTERM'となり、'SIGHUP'も使えると思います。シグナルhereの詳細を読むことができます。

ただし、メインプロセスが既に終了している場合、子プロセスを強制終了する方法について尋ねました。これを行うには、コマンドラインを使用する必要があります。あなたが不正な子プロセスのプロセスIDを知っているなら、単にkill <pid>を実行することができます。ここで、pidはプロセスIDです。プロセスIDは、子プロセスオブジェクトから取得できます。あなたがPIDを知らず、それを得ることができない場合は、ps -eafを実行することができます。これは、コンピュータ上で現在実行されているすべてのプロセスのリストを印刷します。だからあなたが探しているプロセスを見つけるのを助けるために、あなたはps -eaf | grep <process-name>を行うことができ、それがプロセスを見つけるのに役立つかもしれません。例えば、この場合、lsコマンドが死ぬことはなく、実際には起こりませんでした。私はps -eaf | grep lsを実行することができ、それは正しいプロセスとプロセスIDを見つける可能性が高いでしょう。その後、kill <pid>を実行できます。

これが役に立ちます。

+0

あなたの説明をありがとう。私はここで子プロセスに関する別の質問があります:http://stackoverflow.com/questions/39577012/node-js-child-process-with-detached-option、あなたは私を助けることができますか? –

+0

ええ、私は電子をよく知っているわけではないので、翌日にそれを見てみるが、約束はない。また、[この質問](http://stackoverflow.com/questions/39502355/how-to-spawn-a-grandchild-process-for-a-child-process/39542311#39542311)への私の答えが助けられたら、投票したり受理したりしますか? –

+0

ありがとうございます。私はすでに受け入れています。あなたが電子に精通していない場合は、その子プロセスに関する最後の質問に固執してください。 –

関連する問題