Frage

Ein Webdienst ist so konfiguriert, einige ihre Daten zu exponieren, wenn ein USR1 Signal empfängt. Das Signal wird von einem xinetd Server gesendet werden, wenn er eine Anforderung von einem entfernten Client empfängt, z.B. nc myserver 50666. Wenn der Web-Server USR1 Signal empfängt, öffnet es ein spezielles Fifo Rohr, schreibt seine Daten an das Rohr, und dann das Rohr schließen. In der Zwischenzeit liest der xinetd-Server das Rohr und führt zu dem Remote-Client.

In den meisten Zeiten, sie arbeiten gut, aber gelegentlich, aus irgendeinem Grunde, wird die Client dup Datensätze erhalten. Aus dem Protokoll, wie es scheint, das Rohr nicht richtig geschlossen hat und die Cache ist übrig gebliebenen, also, wenn es beim nächsten Mal, beide vorherigen und aktuelle dient an den Client gesendet. Das Problem ist, es ist nicht ständig passiert, wenn man versucht, zu reproduzieren, unglücklicherweise war ich einmal zu reproduzieren nicht in der Lage.

Im Folgenden sind die einfachen Schnipsel, den Prozess zu demonstrieren:

Der Web-Server: (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()

Der xinetd.d Server: (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,

Also, was genau passiert ist das dup verursachen? Wie es ausgelöst? Das aktuelle Update entkoppeln ich die Pipe-Datei und erstellen Sie es jedes Mal, alle Reste zu vermeiden, aber ich weiß nicht, ob das eine richtige Lösung.

War es hilfreich?

Lösung

Wenn Sie zwei Kopien von splitter.py bei gleichzeitig laufen zu bekommen, wird es Ärger geben und fast alles, was passiert, Sie legal ist. Versuchen Sie, einen Prozess-ID-Wert webserver.py, das heißt:

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

Das könnte erhellend sein.

Andere Tipps

Es ist nicht genug, um hier zu debuggen. Sie zeigen nicht, wie der Server Signale behandelt, oder öffnet das Rohr.

Wenn möglich würde ich empfehlen, nicht Signale. Sie sind behaart genug in C, vergeßt mit Python eigenen Besonderheiten auf hinzugefügt.

So ist das eigentliche Problem ist, dass es mehrere Clients existieren. Der Server wurde von anderen unbekannten Kunden abgefragt / missbraucht, die nicht von Anfang an mit Kunden und sicher vereinbart wurden sie unter dem aktuellen Design brechen. Ein Update wurde eingesetzt, um das Problem zu beheben. So Andys Verdacht ist richtig. Danke Leute!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top