3

我想开发主服务器和辅助服务器。

当主服务器关闭时,辅助服务器应该出现在同一个端口上。

但是当主服务器准备启动时,辅助服务器应该优雅地停止,以便主服务器可以在同一个端口上启动。

辅助服务器有什么方法可以知道另一个进程正试图在同一个端口上启动?

4

2 回答 2

3

如果您需要始终启动服务器,则可以遵循此方法,

创建一个父进程,该进程将通过侦听端口产生一个子进程来执行实际服务。waitpid当孩子正在服务实际请求时,父母将通过使用in等待孩子死亡(崩溃/状态变化)C。因此,每当孩子出现故障时,父母都会知道并产生新的进程。-首选方法


如果你特别需要主次设计,

当辅助服务器正在服务请求时,它总是可以等待来自主服务器的信号。因此,当主服务器启动时,它的第一个任务是在发现辅助服务器启动时(通过 pid 文件或文件锁定或绑定失败)向辅助服务器发送该信号,以便辅助服务器可以正常关闭。

于 2013-06-20T17:08:03.310 回答
1

我不相信有一种直接的方法可以检测到该进程正在尝试侦听给定端口,而不是使用诸如 ptrace 之类的调试器钩子拦截实际尝试,或者更可能使用 LD_PRELOAD 进行共享库替换。

但是,如果您可以修改源,您可以很容易地让一个进程通知另一个进程,并要求它让开。您可以使用各种进程间通信方式来执行此操作,例如在它正在侦听的端口上联系它(注意安全隐患),在不同的端口上联系它(仅在环回接口上侦听!),在 unix 域上联系它插座,以及许多其他选择。

要判断另一个进程是否已经在侦听,您可以使用netstat或使用自己直接从 /proc 导出的信息来查看正在使用的套接字。

请注意,除非原始服务器使用 SO_REUSEADDR 标志,否则您可能会遇到超时,然后其他进程才能声明该端口。这可能会争论在备用端口上运行备份,并让客户端尝试将其作为后备。或者有一个简单的进程,它充当两个服务器的唯一端口中的任何一个的端口转发器。

于 2013-06-20T17:11:28.130 回答