2017-04-25 18 views
1

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();     
}); 
+0

危険なルックス - あなたは自分の殻と同じプロセスIDを持つ親を持つことが起こったのランダムなプロセスを殺すことができるよう、プロセスIDは、再利用します。プロセスツリーを処理する最も堅牢な方法は、ジョブオブジェクトを使用することです。 'ノード。js'はそれをサポートしていないので、あなたの代わりに子コマンドを実行するCプログラムを書くことができます。 –

+0

「ジョブオブジェクト」とはどういう意味ですか?私がしたいことは、シェルのプロセスとその子供たちを殺すことです、私は完全な木を殺したいです。その後、他のプロセスがプロセスIDを再利用することができます。 – ChesuCR

+0

ジョブオブジェクトを使用してプロセスツリーを追跡できます。また、すべてのプロセスを終了するために使用することもできます。 [こちらをご覧ください](http://stackoverflow.com/search?q=JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE)残念ながら、簡単ではありません。 'ps-tree 'を使用するリスクは、シェルプロセスのプロセスIDが他のプロセスに以前属していた可能性があることです。あなたはプロセスツリーの中のものだけでなく、そのプロセスの子プロセスもすべて削除します。あなたが親PIDに加えていくつかの他の特性によってそれらを識別できるかどうかは、結果に応じてフィルタリングすることができると思います。 –

答えて

1

をそれはあなたが持つ悩みを持っている一つだからです。

あなたが実行するコマンドを見ると、あなたの2つのコマンドの連結が犯人になる可能性があるので、私はそれなしでやってみるでしょう。

あなたがwmicを使用できない場合は、私が知っている最善の方法です。初めて手動でチェックする必要があります。選択基準を取得したら、すべてを自動的に閉じることができます。 プロセスがビジーですが、エディタ、ファイルprocesses.txtをチェックして、あなたが殺したいすべてのプロセスのための共通の文字列の列commandlineに見えるを使用した後、コマンドにwmic process>processes.txt を実行します。 これが選択基準になります。 プロセスを作成したコマンドライン全体にパスとパラメータがあるので、これは問題ありません。その後

あなたは私が何のcontrollの上に持っていない、悪い行動のJavaアプリを呼び出すRubyスクリプトでこの手法を使用

wmic process Where "CommandLine Like '%my_select_criterium%'" Call Terminate 

コマンドですべてのそれらのプロセスを閉じることができるはずです。

+0

これは、OPの特定の問題にはまったく対応していませんか? ps-treeが動作していないので、wmicコマンド(ps-treeはすでに行っている)を使用するためのAPIは –

+0

@APのみです。私は彼の質問に答えています。 – peter

+1

少なくとも、これをノード固有の回答に包んで、[*** 'spawnSync()' ***](https://nodejs.org/api/child_process.html)を使ってこれを行う方法を示してみることができます#child_process_child_process_spawnsync_command_args_options)または[**** execSync() '***](https://nodejs.org/api/child_process.html#child_process_child_process_execsync_command_options)を参照してください。それは答えとしては適切です。 –

関連する問題