Вопрос

Веб-служба настроена на раскрытие некоторых своих данных при получении сигнала USR1.Сигнал будет отправлен сервером xinetd, когда он получит запрос от удаленного клиента, например.NC мой сервер 50666.Когда веб-сервер получает сигнал USR1, он открывает выделенный канал fifo, записывает в него свои данные, а затем закрывает канал.Тем временем сервер xinetd читает канал и передает его удаленному клиенту.

В большинстве случаев они работают хорошо, но иногда по какой-то причине клиент получает дублированные записи.Судя по журналу, канал не закрылся должным образом и кеш остался, поэтому при следующем обслуживании клиенту отправляются как предыдущий, так и текущий.Проблема в том, что это не происходит постоянно при попытке воспроизвести, к сожалению, мне не удалось воспроизвести ни разу.

Ниже приведены простые фрагменты, демонстрирующие процесс:

Веб-сервер:(вебсервер.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,

Так что же именно послужило причиной дублирования?Как его вызвать?В текущем исправлении я отсоединяю файл канала и каждый раз воссоздаю его, чтобы избежать остатков, но я не знаю, является ли это правильным решением.

Это было полезно?

Решение

Если вы одновременно запустите две копии Splitter.py, возникнут проблемы, и почти все, что с вами произойдет, будет законным.Попробуйте добавить значение идентификатора процесса в webserver.py, то есть:

Pipe.write(str(os.getpid()) + i + ' ')

Это может быть проясняющим моментом.

Другие советы

Здесь недостаточно отладки.Вы не показываете, как сервер обрабатывает сигналы или открывает канал.

Если это вообще возможно, я бы рекомендовал не использовать сигналы.Они достаточно сложны в C, не говоря уже о собственных особенностях Python, добавленных сверху.

Итак, настоящая проблема заключается в том, что существует несколько клиентов.Сервер подвергался запросам/злоупотреблениям со стороны других неизвестных клиентов, которые изначально не были согласованы с клиентами и уверены, что он не будет работать в соответствии с текущим дизайном.Для решения этой проблемы было развернуто исправление.Так что подозрения Энди верны.Спасибо ребята!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top