graceful supervisor

https://github.com/fvbock/endless



https://github.com/jpillora/overseer



优雅重启会生成新的进程id,导致需要修改supervisor 配置,重启supervisor,所以,一般新加一个托管进程,只重启被托管的进程。

只要发生进程的结束和(重新)启动,pid就一定会重新分配(有可能正好是同一个,但一般不是)。pm2我没用过,但如果你观察到一个“进程”“重启”后pid不变,那你观察的那个进程可能并不是真正被重启的进程,而是控制进程,或者说master进程没有重启,worker进程重启了,而你看到的是master进程的pid;也有可能你看到的不是pid,而是管理程序分配的内部id。
如果真的要实现pid不变而重启进程,我能想到的是调用exec,具体怎么调用估计就要写nativeaddon了;想实现对被管理的进程透明的话可能得注入之后想办法调用exec,例如通过插桩或信号处理函数。



最开始我也怀疑stop、start、restart这三个指令可能不会杀掉系统里的进程,但是实际上并不是这样。
我做了以下操作:
检查当前进程pid=20259
执行pm2stop0
查看~/.pm2/pids目录下对应的.pid发现已经被删除了
打开系统进程监视器查看20259进程已经被回收了
执行pm2start0
再次查看~/.pm2/pids目录,发现pid文件已创建,pid=20364
查看进程监视器20364进程创建。
因此得出:pid会改变,进程会被回收
思考补充:
pid代表的是系统的进程,进程被回收则pid会被销毁。pid不改变意味着进程一直占用系统资源,但是stopped状态的程序是不用保留系统进程的,需要销毁。



给nginx发送USR2信号后,nginx会将logs/nginx.pid文件重命名为nginx.pid.oldbin,然后用新的可执行文件启动一个新的nginx主进程和对应的工作进程,并新建一个新的nginx.pid保存新的主进程号



旧的主进程号收到WINCH信号后,将旧进程号管理的旧的工作进程优雅的关闭。即一段时间后旧的工作进程全部关闭,只有新的工作进程在处理请求连接。这时,依然可以恢复到旧的进程服务,因为旧的进程的监听socket还未停止。



(4)给旧的主进程发送QUIT信号,使其关闭。
https://blog.csdn.net/enweitech/article/details/108010829



https://www.cnblogs.com/a-lai/p/7795225.html



Category golang