Web 服务被配置为在接收到 USR1 信号时公开其一些数据。当 xinetd 服务器接收到来自远程客户端的请求时,该信号将由 xinetd 服务器发送,例如 nc myserver 50666。当 web 服务器收到 USR1 信号时,它会打开一个专用的 fifo 管道,将其数据写入管道,然后关闭管道。与此同时,xinetd 服务器读取管道并提供给远程客户端。
在大多数情况下,它们工作得很好,但偶尔,出于某种原因,客户端会收到重复记录。从日志来看,管道似乎没有正确关闭并且缓存是剩余的,所以下次它服务时,以前的和当前的都被发送到客户端。问题是它在尝试复制时不会经常发生,不幸的是,我无法复制一次。
以下是演示该过程的简单片段:
网络服务器:(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 呢?如何触发它?当前修复我取消链接管道文件并每次重新创建它以避免任何剩余但我不知道这是否是一个正确的解决方案。