猿问

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

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 = nullwebpack(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进程乖乖退出(不然影响业务)。以及他们为什么没有退出?


白猪掌柜的
浏览 1207回答 2
2回答

紫衣仙女

默认情况下,父进程退出,子进程将被init进程接管,也就是PPID=1你的环境可以让子进程调用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 itsparent dies.
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答