目前我正在开发我们的IMAP服务器,我需要实现一些“优雅”服务器重启的方法。我们使用boost::asio
(但不是必需的)。我需要保持当前操作适用于已经运行操作的客户端(例如Fetch),但是新的服务器实例(我们正在部署的新版本)应该拦截143& 993端口并开始接受客户端以避免停机。目前我有2个想法:
监听unix域套接字以获取命令。可扩展,但更难实现,因为需要“控制套接字”,它转换到新服务器等等。
信号(例如USR1)。服务器执行一些清理,释放侦听端口,然后fork()
和exec()
进入将继续接受的新实例,而旧实例会为已连接的客户端清除关闭。
......还有其他想法吗?
答案 0 :(得分:2)
UNIX守护程序的一个常见约定是执行软重启以响应SIGHUP
。究竟是什么需要因程序而异。通常,这意味着关闭并重新打开日志文件或重新读取其配置文件。常见的用途是协助日志文件轮换。
为什么SIGHUP
? SIGHUP
的正常目的是在用户注销时发出用户进程的信号。根据定义,守护进程已经从用户的会话和TTY中分离出来,以避免在初始用户注销时被杀死。所以SIGHUP
被重新用于表示“软重启”。
底线:做#2,但SIGHUP
。