Pregunta

Un servicio web está configurado para exponer algunos de sus datos cuando se recibe una señal USR1. La señal será enviada por un servidor xinetd cuando recibe una solicitud de un cliente remoto, por ejemplo, NC 50666. miservidor Cuando el servidor web recibe la señal USR1, se abre un tubo FIFO dedicada, escribirá los datos en el tubo, y luego cerrar la tubería. Mientras tanto, el servidor xinetd lee el tubo y se alimenta al cliente remoto.

En la mayoría de veces, trabajan muy bien, pero de vez en cuando, por alguna razón, el cliente recibirá los registros duplicados. Desde el registro, parece que el tubo no se cierran correctamente y la memoria caché es de sobra, así que cuando la próxima vez que sirve, tanto anterior y el actual se envía al cliente. El problema es que no está ocurriendo constantemente cuando se trata de reproducir, por desgracia, yo no era capaz de reproducir una vez.

Los siguientes son los fragmentos simples para demostrar el proceso:

El servidor web: (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()

El servidor 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,

Entonces, ¿qué sucedió para causar el DUP? Cómo activarlo? La solución actual se desenlaza el archivo de la tubería y volver a crear cada vez para evitar cualquier resto de comida, pero no sé si eso es una solución adecuada.

¿Fue útil?

Solución

Si recibe dos copias de splitter.py se ejecutan al mismo tiempo, habrá problemas y casi cualquier cosa que le sucede a usted es legal. Trate de añadir un valor de proceso id para webserver.py, es decir:

pipe.write (str (os.getpid ()) + i + '\ n')

Esto puede ser esclarecedor.

Otros consejos

No es suficiente para depurar aquí. No se presenta cómo el servidor maneja las señales, o se abre la tubería.

Si es posible que recomendaría no usar señales. Son lo suficientemente peluda en C, no importa con peculiaridades propias del pitón añade en la parte superior.

Así que el verdadero problema es que hay varios clientes existir. El servidor ha sido consultada / abusado de otros clientes desconocidos que inicialmente no estaban siendo acordados con los clientes y asegurarse de que se romperá bajo el diseño actual. Una revisión se ha desplegado para tratar el tema. Así sospecha de Andy es correcto. ¡Gracias chicos!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top