2

javaNodeJS から (経由で) 一連のプロセスを起動していchild_process.spawnます。技術的には、Leiningen (Clojure ビルド ツールlein) を起動しています。後で私は彼らと彼らのすべての子供たちを殺そうとします. しかし、それはほとんど機能せず、javas で満たされたアクティビティ モニター (OSX) しか得られません。

最初に実行してthisProcess.kill(leinProcess.pid);(デフォルトは SIGTERM)、1 秒待ってから を呼び出して、それらを強制終了しleinProcess.kill("SIGKILL");ます。

すべてのプロセスとメイン プロセスは、同じユーザーの下で実行されます。

killall -9 javaコマンドラインからの実行は機能します。

4

2 に答える 2

0

問題は、孤立したjavaサブサブプロセスにありました。説明と解決策については、この readme を参照してください: https://github.com/indexzero/ps-tree

于 2014-06-19T22:30:17.953 に答える
0

私は同じことをしており、lein run異なるマイクロサービスで の複数のインスタンスを起動しています。それらを殺すために、私は使ってきましたnpm install tree-kill

基本的な例

var kill = require('tree-kill');    
var spawn = require('child_process').spawn;

var proc = spawn("lein", ["run"], {cwd: './some-dir', detached: true});
setTimeout(function(){kill(proc.pid); console.log('Take that!');}, 5000);

より現実的な例

var kill = require('tree-kill');
var chalk = require('chalk');

exports.killIfAlive= function(pid) {
  try {
    kill(pid);
  }
  catch(ex) {
    console.error(ex);
  }
};

exports.kill = function(projects) {
  var pids = exports.readPIDFile();

  projects.forEach(function(project) {
    if (pids[project]) {
      console.log('Killing', chalk.cyan(project), chalk.magenta('(pid:', pids[project], ')'));
      exports.killIfAlive(pids[project]);
    }
    else {
      console.log(chalk.cyan(project), chalk.grey('is not running.'));
    }

    delete pids[project];
  });

  return exports.writePIDFile(pids);
};

各プロジェクトを開始した後、その pid を次のような単純なオブジェクトに保存し、{project1: 12352, project2: 50943}それをファイル システムに書き込みます。オプションを使用して実行spawn('lein' ... etc)しているdetachedため、現在のノード プロセスは、leiningen プロセスを削除せずに終了する可能性があります。ノード プロセスを復活させるたびに、pid ファイルを使用して 1 つ以上のプロジェクトを検索および終了できます。このアプローチを採用すると、指定された pid を持つ lein プロセスが既に終了し、その pid の下で新しいプロセスが開始されるなどの競合状態が発生する可能性があります。これは他の誰かが処理するために残します。

于 2015-10-28T17:41:35.407 に答える