技术解析

求问 Supervisor 是怎么处理 fork 自己然后退出的进程的?
0
2021-06-21 07:49:38
idczone

这部分不太了解,今天打算研究之前一个程序重启时出现的奇怪问题.

具体是这样的:
golang写的网络服务,使用了endless包来实现热更新.同时也使用了supervisor进行守护.
使用的时候出现了发送 -hup之后,第一次网络请求会出现 refuse,后续请求正常的情况.我一开始以为是channel没有正确关闭导致的,验证的过程中发现不被supervisor守护的时候问题就没了.我猜可能和这个有点关系.
具体这个 bug 怎么处理我倒是不那么在意,但是比较好奇 supervisor 怎么处理这个情况的,是无脑启动吗?


supervisor 自己没退出吧。。后台服务 其他进程都是 supervisor 的子进程啊
会不会跟进程的工作目录有关呢

以上是我瞎猜的 并不能确定

猜测 supervisor 的工作原理:
fork 后,在子进程中 exec 指定的程序,然后主进程根据 pid 判断(也许是通过 signal? pipe?)检查进程的运行情况。
楼主的情况:
endless 收到 kill -hub 信号后,go 进程 fork:
- 父进程:不接受新的请求,收到子进程发出的 SIGTERM 后退出;
- 子进程:exec 新的 go 二进制文件,监听同一端口,然后发送 SIGTERM 给父进程,父进程结束后该子进程的 ppid 自动变为 1。
supervisor 监控发现 go 进程退出了,于是尝试重新启动,如果端口可重用,此时应该会有两个进程(否则应该有类似 err addr used 的错误)。
建议在 kill -hub 后,用 sudo lsof -i:{{server_port}} 查看是否有两个进程(原有“ go 子进程”和 suervisor 的进程)。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服