V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Vegetable
V2EX  ›  Linux

求问 Supervisor 是怎么处理 fork 自己然后退出的进程的?

  •  
  •   Vegetable · 2019-03-25 17:59:01 +08:00 · 2756 次点击
    这是一个创建于 2065 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    3 条回复    2019-03-25 20:26:11 +08:00
    www5070504
        1
    www5070504  
       2019-03-25 19:35:26 +08:00
    supervisor 自己没退出吧。。后台服务 其他进程都是 supervisor 的子进程啊

    会不会跟进程的工作目录有关呢
    www5070504
        2
    www5070504  
       2019-03-25 19:36:43 +08:00
    以上是我瞎猜的 并不能确定
    siteshen
        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 的进程)。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4019 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:23 · PVG 13:23 · LAX 21:23 · JFK 00:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.