子プロセスを生成する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 });
をそして私はstdout
とstderr
とclose
のために聞く:
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
子プロセスを確実に削除できますか?
ターミナルから実行したときに、それが終了したときに、なぜそれが必要なのでしょうか? NodeJSプロセスは、TTYで異なる動作をしますか? – Aaron
私はこれを試しました。 'docker.js'プロセスを終了させることができます(しかし、CLIからそれが必要ない場合は私の質問が残っています)が、子' docker-compose'プロセスは実行を続けます。 – Aaron
私はドッカーの外でこの問題に直面しました。 Node.jsで使用されているサブプロセスここでの主な違いは、処理プロセスです。サブプロセスの場合は、nodejsスクリプトを処理します。CLIから起動する場合は、OSプロセスです。 – Lazyexpert