无缝重启: 重启过程中不能中断服务,因为网站都是需要7×24提供服务的,不能每次更新代码网站都有一断时间 无法访问,虽然中间可能只有不到1分钟的时间。
不管任何服务进程要实现无缝重启,大概都得按照先开新的进程接,然后优雅的结束老的进程, 优雅的结束老的进程意思是老的进程要处理完当前的请求之后才能结束。
Unicorn 无缝重启简单 5 步搞定:(官方的文档)
给 Unicorn 主进程发送 USR2 信号
kill -USR2 pid
确定当前新的主进程已经完成启动,如果使用 pid 文件,那么会生成一个 .oldbin 的文件存放老的主进程 pid。 现在呢,会有 2 个主进程和双份的 worker 进程,类似下面的进程树:
unicorn master (old) \_ unicorn worker[0] \_ unicorn worker[1] \_ unicorn worker[2] \_ unicorn worker[3] \_ unicorn master \_ unicorn worker[0] \_ unicorn worker[1] \_ unicorn worker[2] \_ unicorn worker[3]
给老的主进程发送 WINCH 信号,要求优雅的结束老的 worker 进程。
确认新的 worker 进程正常,老的 worker 进程已经结束。
如果一切正常,给老的主进程发送 QUIT 信号,要求老的主进程退出。
如果出现问题,那么可以给老的主进程发送 HUP 信号,要求老的主进程重新启动 worker 进程, 然后给新的主进程发送 QUIT 信号,要求新的主进程退出。