2017-07-14 30 views
0

子プロセスを生成するnode.jsプロセスを停止するのに問題があります。ターミナルから.jsプロセスを実行すると、Ctrl+Cを使用して停止できます。しかし、NodeJSアプリからそれを生成すると、kill("SIGINT")を使用してそれを強制終了することはできません。ちょうどそれが続行され、stdoutを報告し続けます。プロセスを起動したプロセスを終了する

ここに設定があります。私は、スクリプトを持って、docker.jsそれを呼び出すことができますし、それがこれを行います:

// docker.js 
child_process.spawn("docker-compose", ["up", "-d", ...args], { stdio: 'inherit' }); 

docker-compose up commandはたくさんのことを行い、数分間、時々、しばらく走ります。

端末から./docker.jsを実行すると、いつでもCtrl+Cを押していつでも解除できます。

私はspawn()またはfork()を使用して、異なる NodeJSアプリ(私の場合における電子アプリ)内部からdocker.jsを起動した場合:

// DockerApp.js 

const dir = `path/to/dockerjs/file/`; 

// Tried this with and without `detached: true` 
const child = spawn("node", [`./docker.js`, ...args], { cwd: dir, env, detached: true }); 

// Also tried this, which uses Electron's packaged node process 
const child = fork(`./docker.js`, args, { cwd: dir, env, silent: true }); 

をそして私はstdoutstderrcloseのために聞く:

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

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

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

すべてがうまくいきます「クローズ」完了後)、私はこのように完了する前にプロセスを停止しようとした場合:

child.kill("SIGINT"); // Equivalent to Ctrl+C in terminal 

子プロセスだけで実行し続け、そして私はstdoutを通じてdocker-compose出力を得続けます。

私はしばらく試しましたが、NodeJS/Electronアプリから子プロセスとして生成されたときにdocker.jsを停止する方法を理解できません。私はCtrl+CをTerminalとし、child.kill("SIGINT")は同じ動作をすると考えましたが、そうではありません。

誰でもここで何が起こっているのか説明できますか?どうすればNodeJSアプリケーションからこのdocker.js子プロセスを確実に削除できますか?

答えて

0

は、子プロセスでこのような何かを試してみてください:

process.on('SIGINT',() => { 
    console.log('Received SIGINT'); 
    process.exit(0); 
}); 
+0

ターミナルから実行したときに、それが終了したときに、なぜそれが必要なのでしょうか? NodeJSプロセスは、TTYで異なる動作をしますか? – Aaron

+0

私はこれを試しました。 'docker.js'プロセスを終了させることができます(しかし、CLIからそれが必要ない場合は私の質問が残っています)が、子' docker-compose'プロセスは実行を続けます。 – Aaron

+0

私はドッカーの外でこの問題に直面しました。 Node.jsで使用されているサブプロセスここでの主な違いは、処理プロセスです。サブプロセスの場合は、nodejsスクリプトを処理します。CLIから起動する場合は、OSプロセスです。 – Lazyexpert

関連する問題