child_process模块怎么真正的杀死子进程
'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.kill
和process.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