我之前在 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).