Domanda

Un servizio web è configurato per esporre alcuni dei suoi dati quando si riceve un segnale USR1. Il segnale sarà trasmesso da un server xinetd quando riceve una richiesta da un client remoto, ad esempio nc myserver 50666. Quando il server Web riceve il segnale USR1, si apre una pipe FIFO dedicato, scrive i suoi dati al tubo, e quindi chiudere il tubo. Nel frattempo, il server xinetd legge il tubo e alimenta al client remoto.

Nella maggior parte delle volte, funzionano bene, ma di tanto in tanto, per qualche motivo, il cliente riceverà record duplicati. Dal registro, sembra che il tubo non ha ottenuto chiuso correttamente e la cache è rimasto, in modo che quando la prossima volta che serve, sia precedenti e attuali vengono inviati al cliente. Il problema è la sua non sempre accade quando si cerca di riprodurre, purtroppo, non ero in grado di riprodurre una volta.

Di seguito sono riportati i semplici frammenti per dimostrare il processo:

Il server 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()

Il server 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,

Così che cosa esattamente è successo a causare il DUP? Come per innescare esso? La correzione corrente a scollegare il file pipe e ricrearlo ogni volta per evitare eventuali avanzi, ma non so se questo è una soluzione adeguata.

È stato utile?

Soluzione

Se si riceve due copie di splitter.py esecuzione allo stesso tempo, ci saranno problemi e quasi tutto ciò che accade a voi è legale. Prova ad aggiungere un valore di processo id webserver.py, vale a dire:

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

Questo potrebbe essere illuminante.

Altri suggerimenti

non è sufficiente per eseguire il debug qui. Non mostrare come il server gestisce i segnali, o si apre il tubo.

Se possibile mi sento di raccomandare che non utilizzano segnali. Sono peloso abbastanza in C, non importa con proprie peculiarità del pitone aggiunto sulla parte superiore.

Quindi, il vero problema è che ci sono più client esistono. Il server è stato interrogato / abusata da altri client sconosciuti che non erano inizialmente essere concordate con i clienti e sicuri si romperà sotto il design attuale. Una correzione è stato schierato per affrontare la questione. Così il sospetto di Andy è giusto. Grazie ragazzi!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top