Nodejでメソッドexec
を使用する必要があります。これは、stdoutリダイレクトを実行し、同時に複数のコマンドを実行する必要があるためです。だから私はこのような子プロセスを実行します。Windowsでexecによって実行される子プロセスを強制終了するにはどうすればよいですか?
let shell = null;
const child_process = require('child_process')
var command = 'activate python_environment & bokeh serve project_folder/ log/logger.log 2>&1';
shell = child_process.exec(command);
私はbelowerコードでそうであるように子供たちを殺すためにps-treeを必要としています。それはUbuntuでうまく動作します。しかし、問題は、子供のプロセスを殺さなければ、Windows上で孤立(ゾンビ)プロセスが発生することです。
const psTree = require('ps-tree')
app.on('window-all-closed', function() {
electron.app.quit()
if(shell != null){
psTree(shell.pid, function (err, children) {
children.map(function (p) {
process.kill(p.PID);
});
});
}
});
ps-tree
モジュールは、LinuxおよびWindows上でコマンドwmic
にコマンドps
を使用しています。だからそれはクロスプラットフォームです。しかし、私の場合はうまくいかない。これを行うより良い方法はありますか?
私はps-tree
ソースコードで調べていましたが、何も見つかりませんでした。
私はelectronも使用しているため、process.kill
を使用しています。
私は手動でwmic
ですべてのプロセスのリストを取得し、それをしようとすべきかと思います。それがps-tree
がしようとしているものです。
注:モジュールtree-kill
はどちらのプラットフォームでも動作しませんでした。
更新
まあ、私は醜い回避策を見つけました。私は、Pythonコードos.getpid()
を通して、私のPythonプロセスPIDを外部ファイルに保存します。これで私はこのようなノード内の問題のPIDにアクセスすることができます。私はWindows用の答え
const fs = require('fs');
fs.readFile(filePath, 'utf-8', function (err, data) {
process.kill(parseInt(data, 10));
app.quit();
});
危険なルックス - あなたは自分の殻と同じプロセスIDを持つ親を持つことが起こったのランダムなプロセスを殺すことができるよう、プロセスIDは、再利用します。プロセスツリーを処理する最も堅牢な方法は、ジョブオブジェクトを使用することです。 'ノード。js'はそれをサポートしていないので、あなたの代わりに子コマンドを実行するCプログラムを書くことができます。 –
「ジョブオブジェクト」とはどういう意味ですか?私がしたいことは、シェルのプロセスとその子供たちを殺すことです、私は完全な木を殺したいです。その後、他のプロセスがプロセスIDを再利用することができます。 – ChesuCR
ジョブオブジェクトを使用してプロセスツリーを追跡できます。また、すべてのプロセスを終了するために使用することもできます。 [こちらをご覧ください](http://stackoverflow.com/search?q=JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE)残念ながら、簡単ではありません。 'ps-tree 'を使用するリスクは、シェルプロセスのプロセスIDが他のプロセスに以前属していた可能性があることです。あなたはプロセスツリーの中のものだけでなく、そのプロセスの子プロセスもすべて削除します。あなたが親PIDに加えていくつかの他の特性によってそれらを識別できるかどうかは、結果に応じてフィルタリングすることができると思います。 –