当客户端断开连接时,xinetd 保持进程打开

当客户端断开连接时,xinetd 保持进程打开

我之前在 stackoverflow 上问过这个问题,并相信它已经得到解决(因此接受了答案)但事实证明它并没有得到解决。:-(

简单来说,我编写了一个 Python 脚本,它只是不断地将文本输出到 stdout,这就是它 24/7 所做的一切。我已将其链接到此 xinetd 文件

服务我的服务
{
    实例 = 1
    端口 = 887
    socket_type = 流
    类型 = 未列出
    等待 = 不
    用户 = 无人
    服务器 = /usr/local/bin/myscript.py
    仅来自 = 127.0.0.1 192.168.1.2
    禁用 = 否
    最大负载 = 5.0
    好 = 5
    每个源 = 1
}

这种方式运行良好,因为当客户端连接时,它会开始在控制台上输出文本。问题是当客户端断开连接时,启动的进程保持打开状态,从而阻塞端口。只允许一个客户端(实例 = 1),但当客户端在连接时重新启动时可能会发生这种情况。

之前我以为这是因为 Python 脚本忽略了 kill 信号(确实如此),但修复这个问题后,观察到了相同的行为。需要澄清的是,kill -1 等现在可以通过 Python 脚本顺利观察到。

我认为这是一个 xinetd 问题并且很容易修复?

答案1

当检测到断开连接时,让服务器进程退出。


Added当服务器的操作系统检测到 TCP 连接已关闭时,对stdout/ 的读取和写入stderr将失败,并出现以下错误:

IOError: [Errno 104] Connection reset by peer

因此,请确保您的代码不会忽略发生的异常。


但是,此方法(以及任何其他方法)仅在服务器知道关于断线。干净重启通常会关闭所有 TCP 连接,但“拔掉插头”则不会。

答案2

您尝试过设置吗wait = yes

根据文献记载,

wait — Defines whether the service is single-threaded (yes) or multi-threaded (no).

相关内容