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进程乖乖退出(不然影响业务)。以及他们为什么没有退出?
2 回答
紫衣仙女
TA贡献1839条经验 获得超15个赞
默认情况下,父进程退出,子进程将被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.
添加回答
举报
0/150
提交
取消