我需要开发一种机制,将生产环境中正在运行的守护进程升级到新版本,而不会丢失客户端(TCP)连接。类似于nginx将其升级到新版本时所做的事情。我需要这个以删除错误或发布次要版本更改,这可能是一天一次。该守护进程是在C for Linux平台上开发的。
升级过程如下:
这个过程非常复杂,所以我想问一下是否有人可以建议一个更好的流程,或者有一些方法可以轻松地做到这一点?目标是在升级过程中减少停机时间。
TIA
答案 0 :(得分:1)
另一种方法是强制old_daemon
fork()/exec()
new_daemon
并立即停止接受。 new_daemon
将自动继承侦听套接字,现有连接和打开文件(除非它们fcntl
到FD_CLOEXEC
)。
那就是说,我认为没有一种干净的方法来交出不完整的工作(据我所知,第4步和第5步试图完成)。如果可能,请让old_daemon
完成它们。
答案 1 :(得分:0)
另一种方法是将大部分恶魔写为共享库,并使用dlopen将新功能链接到正在运行的进程中。这意味着某些部分无法更改,您可能会遇到并发问题,但它不再需要IPC。