【问题标题】:python xinetd client disconnection handlingpython xinetd客户端断线处理
【发布时间】:2016-06-04 02:02:36
【问题描述】:

这可能是也可能不是编码问题。这也可能是 xinetd 守护进程的问题,我不知道。

我有一个从运行 xinetd 的 linux 服务器触发的 python 脚本。 Xinetd 已设置为只允许一个实例,因为我只希望一台机器能够连接到该服务,因此这也受到 IP 的限制。

当前,当客户端连接到 xinetd 时,服务正常工作并且脚本开始将其输出发送到客户端计算机。但是,当客户端断开连接(即:由于重新启动)时,该进程在服务器上仍然处于活动状态,这会阻止客户端在完成重新启动后连接的能力等等。

问:如何在 python 中检测到客户端已断开连接。也许我可以测试客户端是否不再读取标准输出(然后退出脚本),或者在 xinetd 中是否有更简单的方法可以在客户端断开连接时杀死子进程?

(我在 RHEL5 linux 上使用 python 2.4.3 - 需要 2.4 的解决方案,但了解 3.1 解决方案也很有用。)

【问题讨论】:

    标签: python linux


    【解决方案1】:

    为 SIGHUP 添加信号处理程序。 (x)inetd 在套接字断开连接时发送。

    【讨论】:

    • 谢谢,这是一种享受。经过进一步检查,我实际上在代码的其他地方捕获了所有异常,因此没有传递叹气。
    • 很抱歉挖掘了这个,但我才刚刚开始直播。奇怪的是,这实际上并没有像我想象的那样工作。该进程在发送信号一(kill -1 )时终止,这意味着根据这个答案,当 xinetd 断开连接时它应该终止,但它不存在。最初的问题是当客户端连接时由 xinetd 启动的子 python 进程即使在客户端断开连接时也保持活动状态。这个问题仍然存在 :-( 我的 python 进程只是将输出打印到标准输出(并且由于 xinetd,到客户端的屏幕)——我需要提前更改 xinet 的配置吗?
    【解决方案2】:

    监控发送到您的进程的信号。可能你的脚本对 xinet 发送的 SIGHUP 没有响应,监听信号,让它死掉。

    【讨论】:

      【解决方案3】:

      您似乎没有收到 SIGHUP,但您确实收到了 SIGPIPE,至少只要您尝试连接上的任何 IO。如果应用程序长时间不做任何 IO,那么您可以启动一个读取 stdin 的线程,以确保您在断开连接时立即获得 SIGPIPE。这对我的应用程序来说已经足够了,但是除了 xinetd 给我的那些之外,我没有使用任何管道。

      我在网上的几个地方看到人们谈论在客户端断开连接时发送 SIGHUP,所以我编写了一个 inetd python 脚本来测试几个服务器(一个 inetd 和另一个 xinetd),所以你可以使用它来检查发送的信号。它只是将发现的内容记录到 /var/log/test.log。也许会有用。

      #!/usr/bin/python
      
      import os, signal, sys
      
      skip = ["SIGKILL", "SIG_DFL", "SIGSTOP", "SIG_IGN", "SIGCLD", "SIGCHLD"]
      name_map = {}
      identifiers = [i for i in dir(signal) if i.startswith("SIG") and not i in skip]
      
      for i in identifiers:
          name_map[getattr(signal, i)] = i
      
      def handler(num, frame):
          signame = name_map[num]
          os.system("echo handled %s >> /var/log/test.log" % signame)
      
      if __name__ == "__main__":
          for id, name in name_map.iteritems():
              signal.signal(id, handler)
      
          while True:
              print sys.stdin.readline()
              sys.stdout.flush()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多