xinetd mantiene el proceso abierto cuando el cliente se desconecta


0

He hecho esta pregunta más o menos antes en stackoverflow y creía que se resolvería (por lo tanto, acepté la respuesta), pero resulta que no se resolvió. :-(

En términos simples, he escrito un script de Python que solo envía texto constantemente a stdout, eso es todo lo que hace 24/7. Lo he vinculado a este archivo xinetd

servicio myservice
{
    instancias = 1
    puerto = 887
    socket_type = stream
    tipo = SIN LISTA
    espera = no
    usuario = nadie
    servidor = /usr/local/bin/myscript.py
    only_from = 127.0.0.1 192.168.1.2
    deshabilitar = no
    max_load = 5.0
    bonito = 5
    per_source = 1
}

Esto funciona bien tanto como cuando un cliente se conecta, comienza a arrojar texto en su consola. El problema es que cuando el cliente se desconecta, el proceso iniciado permanece abierto y bloquea el puerto. Solo se permite un cliente (instancias = 1), pero esto puede ocurrir cuando el cliente se reinicia mientras está conectado.

Anteriormente pensé que esto se debía a que el script de Python ignoraba las señales de muerte (que era), pero con esto solucionado, se observa el mismo comportamiento. Para aclarar, el script python ahora observa felizmente matar, etc., etc.

¿Asumo que este es un problema de xinetd y bastante fácil de solucionar?

Respuestas:


1

Haga que el proceso del servidor salga cuando detecte una desconexión.


AddedCuando el sistema operativo del servidor detecta que la conexión TCP se ha cerrado, las lecturas y las escrituras desde stdout/ stderrfallarán con:

IOError: [Errno 104] Connection reset by peer

Así que asegúrese de que su código no ignore las excepciones cuando ocurran.


Sin embargo, este (y cualquier otro método) solo funcionará cuando el servidor sepa de la desconexión. Los reinicios limpios generalmente cierran todas las conexiones TCP, pero "desconectar" no lo hace.


¿Es esto por experiencia sólida? ¿Porque, por lo que puedo decir, no hay forma de hacerlo desde el script de Python (tal vez lo hay)? - solo arroja resultados constantemente, similar al comando bash "yes".
Sirex

@Sirex: sys.stdinestá vinculado al socket TCP, y si el socket está cerrado sys.stdin.writefallará. Lo mismo se aplica a cualquier idioma: no puede escribir en un socket cerrado.
Grawity

ok, dejaré esta pregunta abierta ya que me voy a ir por 2 semanas, pero lo probaré cuando regrese. No estoy seguro de si el cliente cierra la conexión tcp limpiamente, pero lo echaré un vistazo en lo anterior, te refieres a sys.stdout y sys.stdout.write, ¿verdad?
Sirex

@Sirex: en realidad quise decir ambas sys.stdiny sys.stdout. (Sí, debería haber sido stdin.read()o stdout.write().)
Grawity

-1

¿Has intentado configurar wait = yes?

Según la documentación, eso es

wait — Defines whether the service is single-threaded (yes) or multi-threaded (no).

Al principio no pareció ayudar, pero probaré más.
Sirex
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.