node 父进程退出了但子进程未退出

发布于 2022-09-11 18:29:47 字数 1084 浏览 14 评论 0

问题描述

图片描述
A进程用spawn启动B进程(webpack打包后的node代码)。B进程fork一个node进程,spawn一个python进程。
当webpack监听到文件变化,重新打包后,A进程会向B进程发送 kill SIGTERM 信号。
此时B进程退出。A进程在webpack打包完成新代码后,重新启动一个新的B进程。显然B进程也会启动新的C D进程。
此时通过 ps -ef| grep '特征'。发现各存在两个C D 进程。如此下去,往复修改代码,C D进程就会越来越多。新的C D 进程ppid是B进程。旧的C D 进程的ppid则是1。

我认为理论上B进程被kill掉。则CD 进程自然也被kill掉。为什么CD进程没有被kill掉,
以及如何才能kill掉?但是A进程退出,这些进程全都退出了。

问题出现的环境背景及自己尝试过哪些方法

我尝试kill SIGKILL 信号给B进程,仍然没有解决到问题。

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

// A进程
let server = null
webpack(config).plugin('done',(){
  //启动B进程
  if (server) {
      console.log('杀掉server')
      server.kill('SIGTERM')
    }

    server = cp.spawn('node', [serverPath], {
      env: Object.assign({ NODE_ENV: 'development' }, process.env),
      silent: false,
    })
    server.stdout.on('data',()=>{})
    server.stderr.on('data', () => {})
})

你期待的结果是什么?实际看到的错误信息又是什么?

如何使B进程被kill时,C D进程乖乖退出(不然影响业务)。以及他们为什么没有退出?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

全部不再 2022-09-18 18:29:47
  1. 默认情况下,父进程退出,子进程将被init进程接管,也就是PPID=1
  2. 你的环境可以让子进程调用prctl 捕获父进程退出信号么?

PR_SET_PDEATHSIG (since Linux 2.1.57)

Set the parent-death signal of the calling process to arg2
(either a signal value in the range 1..maxsig, or 0 to clear).
This is the signal that the calling process will get when its
parent dies.
独自←快乐 2022-09-18 18:29:47
  1. 默认情况,父进程退出,子进程变为"孤儿进程",孤儿进程会被托管给进程init,也就是进程1,所以kill B进程,B进程的子进程C D会被托管给进程1,不会被终止。
  2. 另外你说kill A后所有子进程都会退出?请确认一下,我有点疑问?我觉得子进程应该不会退出。
  3. 请注意“僵尸进程”,你KILL B进程的时候 ,A进程有没有wait,如果没有会产生僵尸进程。
  4. 想终止CD进程 可以对CD执行kill操作强制终止,发送KILL信号,以及使用IPC来通知进程,让进城自己退出。
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文