Question

Un service Web est configurée pour exposer une partie de ses données lors de la réception d'un signal USR1. Le signal est envoyé par un serveur xinetd lorsqu'il reçoit une demande d'un client distant, par exemple, nc mon_serveur 50666. Lorsque le serveur Web reçoit le signal USR1, il ouvre un tuyau fifo dédié, écrit ses données dans le tuyau, puis fermez le tuyau. Entre-temps, le serveur xinetd lit le tuyau et alimente au client distant.

Dans la plupart des temps, ils travaillent bien, mais de temps en temps, pour une raison quelconque, le client recevra des dossiers dup. À partir du journal, il semble que le tuyau ne se ferme correctement et que le cache est restes, donc quand la prochaine fois qu'il dessert, les deux précédents et actuels sont envoyés au client. Le problème est pas constamment sa passe en essayant de reproduire, malheureusement, je ne pouvais reproduire une fois.

Voici les extraits simples pour démontrer le processus:

Le serveur 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()

Le serveur 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,

Alors qu'est-ce qui est arrivé exactement à provoquer la dup? Comment déclencher? Le correctif courant I dissociions le fichier pipe et le recréer à chaque fois pour éviter les restes, mais je ne sais pas si c'est une bonne solution.

Était-ce utile?

La solution

Si vous obtenez deux copies de splitter.py en cours d'exécution en même temps, il y aura des problèmes et presque tout ce qui vous arrive est légal. Essayez d'ajouter un identifiant de processus webserver.py, à savoir:

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

Cela pourrait être éclairante.

Autres conseils

Il ne suffit pas de déboguer ici. Vous ne montrez pas comment le serveur gère des signaux, ou ouvre le tuyau.

Dans la mesure du possible, je recommande de ne pas utiliser des signaux. Ils sont assez poilu en C, Nevermind avec particularités de python ajouté au-dessus.

Donc le vrai problème est qu'il ya plusieurs clients existent. Le serveur a été interrogé / abusé d'autres clients inconnus qui ne sont pas d'accord avec d'abord être clients et QU'ELLE rompre sous la conception actuelle. Un correctif a été déployé pour résoudre le problème. Ainsi, le soupçon d'Andy est juste. Merci les gars!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top