我希望能够开发主服务器和辅助服务器。
当主服务器宕机时,辅助服务器应该在同一个端口上启动。
但是当主服务器准备开始时,辅助服务器应该优雅地停止,以便主服务器可以在同一个端口上启动。 有没有办法让辅助服务器知道另一个进程正在尝试在同一个端口上启动?
当主服务器宕机时,辅助服务器应该在同一个端口上启动。
但是当主服务器准备开始时,辅助服务器应该优雅地停止,以便主服务器可以在同一个端口上启动。 有没有办法让辅助服务器知道另一个进程正在尝试在同一个端口上启动?
sigchild
在其关闭时重新启动它们。 - VoidPointer我不认为有一种直接的方法可以检测到进程正在尝试监听给定端口,除非使用像ptrace这样的调试器挂钩或更可能使用LD_PRELOAD进行共享库替换来拦截实际尝试。
但是,如果您可以修改源代码,您可以相当容易地让一个进程通知另一个进程,并请求它慷慨地让出位置。您可以使用各种进程间通信方式进行此操作,例如在正在侦听的端口上与其联系(请注意安全性影响),在不同的端口上与其联系(仅侦听环回接口!),在Unix域套接字上与其联系等等。
要确定另一个进程是否已经在侦听,请使用netstat
或直接从/proc导出的信息查看正在使用的套接字。
请注意,除非原始服务器使用了SO_REUSEADDR标志,否则在不同进程可以声明该端口之前,您可能会遇到超时。这可能要求在备用端口上运行备份,并要求客户端将其作为后备方案尝试。或者,您可以使用一个简单的进程作为端口转发器,以连接两个服务器的唯一端口之一。