child_process模块怎么真正的杀死子进程
发布于 8 年前 作者 Nuintun 15238 次浏览 来自 问答
'use strict';

var spawn = require('child_process').spawn;

/**
 * normalize exec args
 * @param command
 * @param options
 * @returns {{cmd: *, shell: *, args: *, options: *}}
 */
function normalizeExecArgs(command, options){
  var shell, args;

  // Make a shallow copy before patching so we don't clobber the user's
  // options object.
  options = options || {};

  if (process.platform === 'win32') {
    shell = process.env.comspec || 'cmd.exe';
    args = ['/s', '/c', '"' + command + '"'];
    options.windowsVerbatimArguments = true;
  } else {
    shell = '/bin/sh';
    args = ['-c', command];
  }

  if (options.shell) {
    shell = options.shell;
  }

  return {
    shell: shell,
    args: args,
    options: options
  };
}

function exec(){
  var parsed = normalizeExecArgs.apply(null, arguments);

  return spawn(parsed.shell, parsed.args, parsed.options);
}

var thread = exec('ping www.baidu.com -t', {
  env: process.env,
  cwd: process.cwd()
});

thread.stdout.on('data', function (data){
  console.log(data.toString());
});

thread.stderr.on('data', function (error){
  console.log(error.toString());
});

thread.on('close', function (signal){
  console.log(signal.toString());
});

setTimeout(function (){
  thread.kill();
  // process.kill(thread.pid);
  // process.exit();
}, 6000);

代码跑起来后thread.kill并不能杀死后台ping进程,结果会一直打印,用process.killprocess.exit也无效,任务管理器 中ping进程还在跑,本来想用electron做个命令管理工具 ,然后现在碰到这个问题计划泡汤,无法结束像ping www.baidu.com -t这样在后台一直跑的命令,前天做测试,没注意到这个问题,结果后台默默的开了100多个ping有木有啊 - -!

4 回复

我自己做的例子是用的fork,在子进程所运行的文件里写了process.exit();是可以跑起来的,任务管理器的进程数一直是加加减减; 我又试了一下,感觉延迟600也是ok的,我的观点是你可以在事件互动的最末尾监听一个退出事件,子进程监听到这个事件执行退出;所以你这个问题我感觉是同步异步的问题,不知道对不对,请指教

process.exit(0),表示成功
process.exit(err.code),表示失败

以上两个都可以让子进程退出

@winterZhao 调用的本地应用,无法process.exit(),换了另一种解决方法:thread-kill.js

@hyj1991 主进程不能结束,其他方法解决了:thread-kill.js

回到顶部