[英]Node.js: how to check if spawned process was successfully killed
我正在尝试停止 Node.js 中的衍生进程。 我的DownloaderWrapper
类可以生成并使用一些不同的下载器应用程序,可以通过更改环境变量DOWNLOADER_PATH
来换出这些应用程序。 但是,我注意到根据正在使用的下载器应用程序,它不会响应stop
函数发送的SIGKILL
信号并继续运行。
有什么办法可以确保停止生成的进程? 或者,如果我不能,我是否可以检测一个进程是否未能停止并在我的stop
函数中返回'failed'
?
在 Windows 上测试。
export default class DownloaderWrapper {
constructor() {
this.process;
}
async download(spawnArgs) {
if (!process) {
this.process = spawn(process.env.DOWNLOADER_PATH, spawnArgs, { windowsHide: true });
}
}
async stop() {
if (this.process) {
this.process.kill('SIGKILL');
return new Promise(resolve => {
this.process.on('close', (code, signal) => {
console.log(`child process terminated due to receipt of signal "${signal}"`);
resolve('stopped');
});
});
} else {
return 'stopped';
}
}
}
尝试将您的停止功能更改为:
function stop() {
return new Promise((resolve, reject) => {
if (this.process) {
this.process.on('exit', (code) => {
resolve('stopped with code ' + code);
});
this.process.kill('SIGKILL');
} else {
reject('no process running');
}
});
}
// eg
stop().then((result) => {
console.log(result);
}).catch((err) => {
console.error(err);
});
我可能是错的,但我认为没有必要将停止函数定义为异步,因为无论如何你都在返回一个 Promise。 在您的原始代码中,您正在添加侦听器之前终止进程。 此外,我在 NodeJS 官方文档中找不到关于名为“close”的 Process.on 侦听器的文档,这就是我在代码中用 process.on('exit') 替换它的原因。 希望其中一些事情可以解释为什么您没有看到任何证据表明您的进程被终止,因为它没有被终止,即使它被终止,您也不会看到消息,因为没有像 close 这样的事件。
另外,按照这段代码的方式,在进程被杀死后,你仍然在this.process中存储了一个Process对象。 如果您再次调用 stop() 函数,那么 if(this.process) 仍然为真,它会再次尝试杀死它。 根据您的用例,您可能希望在杀死它后将 this.process 设置为 null 或 undefined。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.