为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

白猪掌柜的 2019-03-25 11:01:28
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个赞

  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 itsparent dies.


查看完整回答
反对 回复 2019-03-25
  • 2 回答
  • 0 关注
  • 1133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信