等待NodeJS执行程序,然后杀死所有子进程

时间:2018-07-19 20:10:31

标签: javascript node.js async-await

目标-使用NodeJS exec执行Shell命令。等待它的响应有两个原因:-

  1. 我想使用exec一次执行多个命令。
  2. 我想衡量每个exec的执行时间。

现在,由于exec未返回诺言,我正在使用库node-exec-promise

问题 -我的exec命令有可能陷入无限循环。 如果这样做,我想终止该进程。

NodeJS exec允许我们传递timeout参数。但是,这并没有杀死所有子进程。因此,为了做到这一点,我正在使用tree-kill库。为了使用tree-kill,我必须获取node-exec-library不返回的进程的pid。如何从库pid中获取node-exec-promise

相关代码-

var promiseexec = require('node-exec-promise').exec;
var kill = require('tree-kill');

async functionOne(params){
    for (let i = 0; i < arr.length; i++) {
        let item = arr[i];
        let start = now();
        const p = await this.functionTwo(params);
        let end = now();
        console.log(p.pid); // undefined logs here
        kill(p.pid, 'SIGKILL', function(err) {
        console.log(err);
        });
        let time  = ((end-start)/1000).toFixed(3)
        console.log(time);
    }
}


async functionTwo(params){
    const p = await promiseexec(command, {timeout: 10000}, (error,stdout,stderr) => {
    if(error!=null){
        console.log(error);
    }
    });
    return p; //this p is not the one that NodeJs exec returns
}

这也许是一种完全错误的做事方式。如果是这样,请提出一个替代方案。

1 个答案:

答案 0 :(得分:0)

node-exec-promise无法实现:

  1. promiseexec返回stdoutstderr,而不是ChildProcess对象。
  2. promise只会在解决或拒绝时返回任何内容,因此即使promiseexec返回ChildProcess对象,您也只能在命令完成/失败后才能得到它。
  3. promiseexec仅接受一个参数,因此您的超时选项将被忽略。

您将不得不使用香草回调样式,该样式将返回适当的子流程对象(包括.pid),或将其包装到具有取消功能的bluebird中。