一个web服务被配置接收USR1信号时,以露出它的一些数据。该信号将通过一个xinetd的服务器时,它接收来自远程客户端的请求,例如发送当Web服务器接收USR1信号NC MYSERVER 50666.,它打开一个专用FIFO管,其数据写入到管道,然后关闭该管。在此期间,xinetd的服务器读取管和馈送到远程客户端。

在大多数时候,他们很好但偶尔的工作,出于某种原因,客户端将收到的DUP记录。从日志,好像管道没有得到正确关闭和缓存剩的,所以当在下一次服务,无论过去和现在都发送到客户端。问题是,它不经常发生试图重现的时候,不幸,我无法重现一次。

证明过程以下是简单的片段:

网络服务器:(webserver.py)

def SendStream(data, pipe):
  try:
    for i in data:
      pipe.write(i + '\n') 
      pipe.flush()
  finally:
      pipe.close()

def Serve():
  threading.Thread(target=SendStream, args=(data, pipe)).start()

在xinetd.d服务器:(spitter.py)

def Serve():
  if not os.path.exists(PIPE_FILE):
    os.mkfifo(PIPE_FILE)
  os.kill(server_pid, signal.SIGUSR1)
  for i in open(PIPE_FILE):
    print i,

那么到底发生了什么导致的DUP?如何触发呢?目前修复我断开链接的管道文件和每一个以避免任何剩菜时间重新创建它,但我不知道这是一个妥善的解决办法。

有帮助吗?

解决方案

如果你在同一时间运行splitter.py的两个副本,就会有麻烦,几乎任何事情发生在你身上是合法的。尝试添加值的处理id来webserver.py,即:

pipe.write(STR(os.getpid())+ I + '\ n')

这可能被照明。

其他提示

有是不够的,在这里进行调试。你不显示服务器如何处理信号,或打开管道。

如果在所有可能的我建议不使用的信号。他们毛茸茸的足够C,在上面没关系用python的特殊性补充说。

所以,真正的问题是,有多个客户端存在。该服务器已被质疑/从最初并未被同意与客户和肯定,这将当前的设计下破其他未知的客户滥用。一个修复程序已被部署到解决这一问题。因此安迪的怀疑是正确的。多谢你们!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top