Como você libera uma porta mantida aberta por um processo morto?

63

Um colega meu recentemente encontrou um problema em que um processo que supostamente havia morrido ainda estava vinculado a uma porta de rede, impedindo que outros processos se ligassem a essa porta. Especificamente, netstat -a -bestava relatando que um processo nomeado Systemcom o PID 4476 tinha a porta 60001 aberta, exceto que não existia nenhum processo com o PID 4476, pelo menos até onde eu sabia.

O Process Explorer e o Gerenciador de Tarefas não listaram o PID 4476 (embora houvesse outro processo nomeado Systemcom o PID 4, que tinha seu próprio conjunto de conexões TCP que não incluíam 60001). taskkill /PID 4476também relatou que o PID 4476 não foi encontrado.

Existe uma maneira de matar esse misterioso processo do sistema para liberar a porta à qual está atualmente vinculada? O que pode causar isso? Como pode haver processos que nenhum dos Gerenciador de Tarefas, Process Explorer e taskkill conhecem? A reinicialização conseguiu corrigir o problema, mas eu gostaria de saber se há uma maneira de corrigir isso sem reiniciar.

Adam Rosenfield
fonte
Quanto tempo você esperou para ver se a porta foi liberada? Em que estado estava a conexão (porta)? Estabelecido, Fechado, Time_Wait?
precisa saber é o seguinte
@joeqwerty: Esperamos pelo menos 15 a 20 minutos. Infelizmente, esqueço o estado em que a conexão estava = /.
Adam Rosenfield
20 minutos parece um problema. Na próxima vez em que ocorrer, execute o netstat e verifique o estado da conexão, que lhe dará uma pista do que está acontecendo. Como você comentou a resposta do mfinni, no entanto, pode ser o resultado de um travamento do seu software \ serviço.
precisa saber é o seguinte

Respostas:

58

Eu sei que esse é um tópico antigo, mas no caso de alguém ter o mesmo problema, eu tinha ...

O que pode estar acontecendo é que o seu processo teve uma porta TCP aberta quando travou ou saiu sem fechá-la explicitamente. Normalmente, o sistema operacional limpa esses tipos de coisas, mas somente quando o registro do processo desaparece. Embora o processo pareça não estar mais em execução, há pelo menos uma coisa que pode manter um registro, para evitar a reutilização do seu PID. Essa é a existência de um processo filho que não é desanexado do pai.

Se o seu programa gerou algum processo enquanto estava em execução, tente matá-lo. Isso deve fazer com que seu registro de processo seja liberado e a porta TCP seja limpa. Aparentemente, o Windows faz isso quando o registro é lançado, não quando o processo é encerrado como eu esperava.

Ogapo
fonte
11
Obrigado, bom senhor. Não acredito que essa resposta seja tão baixa, especialmente porque a consulta do google está cheia de respostas "use TCPView / use netstat & taskkill" que não ajudam nesse caso. No meu caso, o que ajudou foi executar o ProcessExplorer e procurar qualquer processo que ficou órfão. Desligá-los resolveu o problema.
gwiazdorrr
3
Obrigado pela sua dica !! Killing orphand process realmente resolveu o problema.
Darkthread
Obrigado!! Foi exatamente o que aconteceu comigo. Eu matei o processo órfão e a porta foi liberada. Não sei como procurar processos órfãos usando o Process Explorer, mas sabia os nomes dos processos gerados, por isso foi fácil encontrá-los.
Grezzo
11
Tivemos o mesmo problema - e, usando o Process Explorer, o Dr. Watson estava segurando o antigo PID. Pesquisamos (Localizar) a porta que o serviço estava tentando abrir e, em seguida, vimos 3-4 entradas para o Dr. Watson e o PID que estava usando. Estranhamente, não tivemos que implicitamente matar nada. Parece que esse processo 'acordou' e desapareceu. Na próxima vez que tentamos reiniciar o serviço, ele saiu bem.
tresstylez
Problema semelhante pode acontecer durante a depuração com o VS. Estou anexando o VS ao processo e, após alguns ciclos, a situação descrita acontece, mas nenhum dos meus processos (incluindo os filhos) sai. Mas matar "vsjitdebugger" ajuda.
Dmitry Azaraev
6

Você tentou usar o TCPView e fechar a conexão? Não sei se ele mostrará a conexão no cenário que você está descrevendo, porque nunca aconteceu isso comigo. Mas é a única coisa em que consigo pensar se isso acontecer novamente.

Qual foi o processo - foi um software comercial ou algo caseiro? Parece que a porta 60001 é usada por alguns Trojans - eu me pergunto se poderia ter sido um rootkit ou algo que poderia se esconder do sistema operacional? Pode querer dar uma boa olhada nessa máquina com o AV, talvez algo da mídia inicializável.

mfinni
fonte
Não, não experimentamos o TCPView; Vou manter isso em mente para o futuro se isso acontecer novamente. O software é nosso software interno que usa a porta 60001 - estou quase certo de que o processo que mantinha a porta aberta era uma instância anterior do nosso software que, de alguma forma, não morreu completamente. Isso impediu o lançamento de outra cópia do software.
Adam Rosenfield
Seu aplicativo pode definir a opção SO_REUSEADDR do soquete como true antes de vinculá-lo. Isso deve resolver o seu problema (é ainda mais ou menos obrigatória em * nix)
Stephane
3

Abrir prompt de comando como administrador

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

*** Repita a etapa 2 até que não haja mais processo filho

  1. C: \ WINDOWS \ system32> processo wmic, em que (ParentProcessId = 1091) obtém Caption, ProcessId

    ProcessId da legenda

    cmd.exe 1328

2.a. C: \ WINDOWS \ system32> processo wmic em que (ParentProcessId = 1328) obtém Caption, ProcessId

  Caption  ProcessId

  conhost.exe  1128

2.b. repita isso até que nenhum outro processo filho seja encontrado

- Então mate todos os processos filhos

  1. C: \ WINDOWS \ system32> taskkill / F / PID 1128 SUCESSO: O processo com o PID 9500 foi encerrado.
Srinivas
fonte
O comando wmic foi a única maneira pela qual conseguimos identificar o processo filho, mantendo nossas portas abertas. Muito Obrigado.
K Erlandsson
Essa também foi a única maneira que encontrei para corrigir meu problema. O processo principal foi encerrado e o processo filho estava em um estado suspenso, mas ainda mantinha a porta TCP com o estado "Escutando". Obrigado.
Gui
1

Já enfrentei o mesmo problema anteriormente, o comando netstat -a -n windows me deu a lista de portas abertas com o ID do processo. A partir daí, peguei o número da porta que desejava fechar a conexão e fechei a conexão usando o software TCPView. Isso funcionou para mim.

Elavarasi
fonte
-4

Se você é usuário do Windows, siga as etapas abaixo: Etapa 1: Vá para este caminho: Painel de Controle \ Todos os Itens do Painel de Controle \ Ferramentas Administrativas

Etapa 2: clique em serviços

Etapa 3: Interrompa os serviços indesejados em execução na porta desejada.

user314053
fonte
-5

ps -ef | grep processname

mate os processos relacionados

matar -9 pid pid

Trabalhou no meu caso

java geek
fonte
6
esta pergunta é sobre o Windows, não Linux
longneck