【发布时间】:2017-03-19 22:34:21
【问题描述】:
我正在寻找一种方法来检查基于 Twisted 的程序的状态,以便确定连接的客户端数量并查看我收集的其他指标(例如连接建立时间或最后一次联系)。
我的想法是为进程添加SIGUSR1 的信号处理程序,这样当进程接收到它时,它会将状态转储到已知位置的文件中。这有几个问题:
- Twisted 使用自己的处理程序覆盖信号处理程序,因为当信号到达时,进程以
stdout上的“收到用户信号 1”结束,并且我的代码没有被调用 - 考古研究on a mailing list 显示Twisted 不会覆盖
SIGINT的处理程序;然而事实并非如此(Python 2.7.11 和 Twisted 16.1.1),进程在stdout上以“KeyboardInterrupt”退出。 - 其他资源建议
reactor.run(installSignalHandlers=False)或reactor.run(installSignalHandlers=0),但这似乎没有效果。
因此我有几个问题:
- 处理信号的意识形态正确方法是什么? (如果可能的话)
- 为 Twisted 服务器实施这种“状态自省”工具的推荐方法是什么? (我正在考虑让它监听另一个端口上的 TCP 连接,并将其用作 POSIX 信号的替代方案 - 但我觉得我让事情变得太复杂了)。
感谢您抽出宝贵时间阅读本文,我期待着来自这个星球的蜂巢思维的提示。
这是邮件列表的相关摘录:
> 如果你这样做,你会破坏 spawnProcess。幸运的是,如果你只是 > 安装一个 SIGINT 处理程序,Twisted 不会踩它: > exarkun 魅力:~$ python > Python 2.5.2(r252:60911,2008 年 7 月 31 日,17:28:52)[GCC 4.2.3 > (Ubuntu 4.2.3-2ubuntu7)] 在 linux2 上 > 输入“帮助”、“版权”、“学分”或“许可”以获取更多信息。 > >>> def f(*a): > ...打印'信号' > ... >>> 导入信号 > >>> signal.signal(signal.SIGINT, f) > > >>> 从 twisted.internet 导入反应器 > >>> reactor.run() > 信号 > 信号 > 信号 > 退出【问题讨论】: