¿Cómo liberas un puerto que se mantiene abierto por un proceso muerto?

63

Un colega mío recientemente se encontró con un problema en el que un proceso que supuestamente había muerto todavía estaba vinculado a un puerto de red, evitando que otros procesos se vincularan a ese puerto. Específicamente, netstat -a -binformaba que un proceso nombrado Systemcon PID 4476 tenía el puerto 60001 abierto, excepto que no existía ningún proceso con PID 4476, al menos por lo que pude ver.

Process Explorer y Task Manager no enumeraron PID 4476 (aunque hubo otro proceso nombrado Systemcon PID 4, que tenía su propio conjunto de conexiones TCP que no incluía 60001). taskkill /PID 4476También informó que no se pudo encontrar el PID 4476.

¿Hay alguna manera de matar este misterioso proceso del Sistema para liberar el puerto al que está vinculado actualmente? ¿Qué puede hacer que esto suceda? ¿Cómo puede haber procesos que ninguno de Task Manager, Process Explorer y taskkill desconocen? El reinicio logró solucionar el problema, pero me gustaría saber si hay una manera de solucionarlo sin reiniciar.

Adam Rosenfield
fuente
¿Cuánto tiempo esperó para ver si se liberó el puerto? ¿En qué estado estaba la conexión (puerto)? Establecido, Cerrado, Time_Wait?
joeqwerty
@joeqwerty: esperamos al menos 15-20 minutos. Desafortunadamente, olvido en qué estado estaba la conexión = /.
Adam Rosenfield
20 minutos suena como un problema. La próxima vez que ocurra, ejecute netstat y verifique el estado de la conexión, eso le dará una pista de lo que está sucediendo. Sin embargo, como comentó la respuesta de mfinni, puede ser el resultado de la falla de su software / servicio.
joeqwerty

Respuestas:

58

Sé que este es un hilo viejo, pero en caso de que alguien más tenga el mismo problema, tuve ...

Lo que puede estar sucediendo es que su proceso tenía un puerto TCP abierto cuando se bloqueó o salió de otro modo sin cerrarlo explícitamente. Normalmente, el sistema operativo limpia este tipo de cosas, pero solo cuando el registro del proceso desaparece. Si bien puede parecer que el proceso ya no se está ejecutando, hay al menos una cosa que puede mantener un registro del mismo, para evitar la reutilización de su PID. Esta es la existencia de un proceso hijo que no está separado del padre.

Si su programa generó algún proceso mientras se estaba ejecutando, intente matarlos. Eso debería liberar su registro de proceso y limpiar el puerto TCP. Aparentemente, Windows hace esto cuando se libera el registro, no cuando el proceso sale como esperaba.

Ogapo
fuente
1
Gracias buen señor. No puedo creer que esta respuesta sea tan baja, especialmente porque la consulta de Google está llena de respuestas "use TCPView / use netstat & taskkill" que no ayudan en este caso. En mi caso, lo que ayudó fue ejecutar ProcessExplorer y buscar cualquier proceso que hubiera quedado huérfano. Cerrarlos resolvió el problema.
gwiazdorrr
3
Gracias por tu pista! El proceso de matar a los huérfanos realmente resolvió el problema.
Darkthread
¡¡Gracias!! Esto fue exactamente lo que me pasó. Maté el proceso huérfano y el puerto fue liberado. No estoy seguro de cómo buscar procesos huérfanos usando el explorador de procesos, pero sabía los nombres de los procesos que se generaron, por lo que fue fácil de encontrar.
Grezzo
1
Tuvimos este mismo problema, y ​​al usar Process Explorer vimos que el Dr. Watson se aferraba al viejo PID. Buscamos (Buscar) el puerto que el servicio intentaba abrir, y luego vimos 3-4 entradas para el Dr. Watson y el PID que estaba usando. Por extraño que parezca, no tuvimos que matar implícitamente nada. Parece que ese proceso 'lo despertó' y desapareció. La próxima vez que intentamos reiniciar el servicio, salió bien.
tresstylez
Un problema similar puede ocurrir durante la depuración con VS. Adjunto VS al proceso, y después de algunos ciclos, la situación descrita ocurre, pero no se van mis procesos (incluido el niño). Pero matar a "vsjitdebugger" ayuda.
Dmitry Azaraev
6

¿Intentó usar TCPView y cerrar la conexión? No sé si mostrará la conexión en el escenario que estás describiendo, porque nunca me ha pasado eso. Pero es lo único en lo que puedo pensar si esto sucede nuevamente.

¿Cuál fue el proceso? ¿Fue software comercial o algo de cosecha propia? Parece que algunos troyanos utilizan el puerto 60001. Me pregunto si podría haber sido un rootkit o algo que pudiera ocultarse del sistema operativo. Es posible que desee darle a esa máquina una buena revisión con AV, tal vez algo de medios de arranque.

mfinni
fuente
No, no probamos TCPView; Lo tendré en cuenta para el futuro si alguna vez vuelve a suceder. El software es nuestro software interno que utiliza el puerto 60001: estoy casi seguro de que el proceso que mantuvo abierto el puerto fue una instancia anterior de nuestro software que de alguna manera no se perdió por completo. Eso evitó que se iniciara otra copia del software.
Adam Rosenfield
Su aplicación puede establecer la opción SO_REUSEADDR del socket en true antes de vincularla. Eso debería resolver su problema (es aún más o menos obligatorio en * nix)
Stephane
3

Abrir símbolo del sistema como administrador

  1. C: \ WINDOWS \ system32> netstat -ano | Findstr: 7895

*** Repita el paso 2 hasta que no haya más procesos secundarios

  1. C: \ WINDOWS \ system32> proceso wmic donde (ParentProcessId = 1091) obtiene Caption, ProcessId

    ID del proceso de subtítulos

    cmd.exe 1328

2.a. C: \ WINDOWS \ system32> proceso wmic donde (ParentProcessId = 1328) obtiene Caption, ProcessId

  Caption  ProcessId

  conhost.exe  1128

2.b. repita esto hasta que no se encuentren más procesos secundarios

- Luego elimine todos los procesos secundarios

  1. C: \ WINDOWS \ system32> taskkill / F / PID 1128 ÉXITO: ​​El proceso con PID 9500 ha finalizado.
Srinivas
fuente
El comando wmic fue la única forma en que logramos identificar el proceso secundario que realmente mantenía abiertos nuestros puertos. Muchas gracias.
K Erlandsson
Esta fue también la única forma en que encontré para solucionar mi problema. El proceso principal desapareció y el proceso secundario se encontraba en estado suspendido, pero aún mantenía el puerto TCP con un estado "Escucha". Gracias.
Gui
1

Me he enfrentado al mismo problema anteriormente, el comando netstat -a -n windows me dio la lista de puertos abiertos con ID de proceso. A partir de ahí, tomé el número de puerto que quería cerrar y luego lo cerré usando el software TCPView. Esto funcionó para mí.

Elavarasi
fuente
-4

Si es usuario de Windows, siga los pasos a continuación Paso 1: vaya a esta ruta: Panel de control \ Todos los elementos del Panel de control \ Herramientas administrativas

Paso 2: haga clic en servicios

Paso 3: Detenga la ejecución de servicios no deseados en el puerto deseado.

usuario314053
fuente
-5

ps -ef | nombre de proceso grep

matar los procesos relacionados

matar -9 pid pid

Trabajado en mi caso

java geek
fuente
66
Esta pregunta es sobre Windows, no sobre Linux
longneck