gpt4 book ai didi

node.js - 在 NodeJS 中执行 Ctrl-C 时优雅地结束 child

转载 作者:行者123 更新时间:2023-12-05 03:52:47 25 4
gpt4 key购买 nike

我有一个架构,其中一个父级生成一个子级,如下所示:

this.process = child.spawn(this.cmd, this.args);

this.process.on('exit', (code: number, signal: string) => {
this.exitCode = code;
console.log(`exit code: ${code}`);
});

没有特别的选择,因为我想与 child 保持联系。因此,当我按 Ctr-C 杀死父进程时,它会捕获 SIGINT 以 (1) 结束子进程,(2) 正确退出。但是 SIGINT 也会传播给 child ,所以 parent 无法优雅地结束它。那么,有办法吗?也许通过阻止 SIGINT 传播给 child ?还是告诉 child 忽略信号?

我知道在生成时添加选项 detached: truestdio: 'ignore' 是可能的,但我不想这样做,因为如果 parent 去世了,我最终得到了僵尸进程。而保留链接可确保在 parent 意外死亡时杀死 child 。最后,我想避免在 child 身上捕获 SIGINT,因为我想让它保持沉默。

编辑: 父级已经有一个 process.on('SIGINT', () => { ... } 并且子级在 python 中。

最佳答案

您可以像这样捕获退出代码:

process.on('SIGINT', () => {
// handle it yourself
})

您可以像这样将它传播给 child :

process.on('SIGINT', () => {
this.child.kill('SIGINT')
})

子进程当然也可以选择处理信号,明智的做法是不要假设子进程会仅仅因为您发送了一个信号就退出。您可能需要设置超时并发送重复或不同的信号以完全终止进程。您还需要收听子进程的 'exit' 消息,以了解它在继续之前实际终止的时间。

文档

关于node.js - 在 NodeJS 中执行 Ctrl-C 时优雅地结束 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62043612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com