La situación es la siguiente:
Un servicio / proceso padre está conectado a un "puerto público" (el proceso padre es un servicio). Ese "puerto público" es 11000. Cuando llegan nuevas solicitudes al proceso primario desde el puerto 11000, el servidor envía esas solicitudes a un proceso secundario utilizando un puerto (socket) "privado". Ya sabes, la forma típica de implementar servidores.
El proceso padre se cierra pero el socket no está cerrado (todavía no sé el motivo).
El proceso huérfano está esperando que el socket esté cerrado y pkill no funciona (está en suspensión ininterrumpida).
No puedo volver a ejecutar el servidor porque el servidor dice que la dirección (0.0.0.0:11000) ya está en uso.
Entonces, tengo dos opciones, cerrar el "socket interno" para finalizar el proceso huérfano, o "liberar" de alguna manera la dirección / puerto 0.0.0.0:11000 para ejecutar el servidor nuevamente, y dejar el proceso huérfano en estado de espera. Lo importante es evitar reiniciar el servidor cada vez que falla, mientras investigo el problema.
Información útil sobre la situación (el pid del proceso hijo es 1993):
$ sudo lsof -np 1993
[...]
proc 1993 root 16u IPv4 14997 0t0 TCP 127.0.0.1:42982->127.0.0.1:37528 (CLOSE_WAIT)
Entonces, el puerto que quiero cerrar es 37528. El descriptor de archivo del socket correspondiente es 16u (o eso es lo que creo).
$ sudo strace -p 1993
Process 1993 attached
futex(0x2fff414, FUTEX_WAIT_PRIVATE, 1, NULL
$ netstat -np
[...]
tcp 0 0 127.0.0.1:42982 127.0.0.1:37528 CLOSE_WAIT -
Si trato de conectarme al proceso huérfano por medio de gdb
:
$ gdb -p 1993
Attaching to process 1993
{process_path} (deleted): No such file or directory.
Porque el proceso de los padres es asesinado, creo. La cuestión es que no puedo conectarme al proceso huérfano para llamar close(16u)
.
¿Cómo puedo "resolver" la situación?
NOTAS : Ya he intentado reiniciar el networking
servicio, pero no funciona. Es un Ubuntu Server 14.04 (VirtualBox), y me conecto a mi máquina usando ssh. No hay administrador de red.
He intentado aplicar ifdown
, ifup
a cada interfaz (eth0, eth1, y lo virbr), pero no cierre el zócalo.