目标-使用NodeJS exec
执行Shell命令。等待它的响应有两个原因:-
exec
一次执行多个命令。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
}
这也许是一种完全错误的做事方式。如果是这样,请提出一个替代方案。
答案 0 :(得分:0)
node-exec-promise
无法实现:
promiseexec
返回stdout
和stderr
,而不是ChildProcess
对象。promiseexec
返回ChildProcess
对象,您也只能在命令完成/失败后才能得到它。promiseexec
仅接受一个参数,因此您的超时选项将被忽略。您将不得不使用香草回调样式,该样式将返回适当的子流程对象(包括.pid
),或将其包装到具有取消功能的bluebird
中。