这部分不太了解,今天打算研究之前一个程序重启时出现的奇怪问题.
具体是这样的:
用golang
写的网络服务,使用了endless
包来实现热更新.同时也使用了supervisor
进行守护.
使用的时候出现了发送 -hup
之后,第一次网络请求会出现 refuse,后续请求正常的情况.我一开始以为是channel
没有正确关闭导致的,验证的过程中发现不被supervisor
守护的时候问题就没了.我猜可能和这个有点关系.
具体这个 bug 怎么处理我倒是不那么在意,但是比较好奇 supervisor 怎么处理这个情况的,是无脑启动吗?
1
www5070504 2019-03-25 19:35:26 +08:00
supervisor 自己没退出吧。。后台服务 其他进程都是 supervisor 的子进程啊
会不会跟进程的工作目录有关呢 |
2
www5070504 2019-03-25 19:36:43 +08:00
以上是我瞎猜的 并不能确定
|
3
siteshen 2019-03-25 20:26:11 +08:00
猜测 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 的进程)。 |