实现软服务器重启

时间:2013-07-05 19:15:11

标签: c++

目前我正在开发我们的IMAP服务器,我需要实现一些“优雅”服务器重启的方法。我们使用boost::asio(但不是必需的)。我需要保持当前操作适用于已经运行操作的客户端(例如Fetch),但是新的服务器实例(我们正在部署的新版本)应该拦截143& 993端口并开始接受客户端以避免停机。目前我有2个想法:

  1. 监听unix域套接字以获取命令。可扩展,但更难实现,因为需要“控制套接字”,它转换到新服务器等等。

  2. 信号(例如USR1)。服务器执行一些清理,释放侦听端口,然后fork()exec()进入将继续接受的新实例,而旧实例会为已连接的客户端清除关闭。

  3. ......还有其他想法吗?

1 个答案:

答案 0 :(得分:2)

UNIX守护程序的一个常见约定是执行软重启以响应SIGHUP。究竟是什么需要因程序而异。通常,这意味着关闭并重新打开日志文件或重新读取其配置文件。常见的用途是协助日志文件轮换。

为什么SIGHUPSIGHUP的正常目的是在用户注销时发出用户进程的信号。根据定义,守护进程已经从用户的会话和TTY中分离出来,以避免在初始用户注销时被杀死。所以SIGHUP被重新用于表示“软重启”。

底线:做#2,但SIGHUP