Веб-сервис настроен на предоставление некоторых своих данных при получении сигнала USR1. Сигнал будет отправлен сервером xinetd, когда он получит запрос от удаленного клиента, например, nc myserver 50666. Когда веб-сервер получает сигнал 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,
Так что именно случилось с дуплом? Как это вызвать? В текущем исправлении я отсоединяю файл канала и каждый раз воссоздаю его, чтобы избежать остатков, но не знаю, является ли это правильным решением.