Как освободить порт, удерживаемый открытым мертвым процессом?

Мой коллега недавно столкнулся с проблемой, когда процесс, который предположительно умер, все еще был связан с сетевым портом, не позволяя другим процессам связываться с этим портом. В частности, netstat -a -b сообщал, что процесс с именем System с PID 4476 был открыт порт 60001, за исключением того, что никакого процесса с PID 4476 не было, по крайней мере, насколько я мог судить.

Обозреватель процессов и диспетчер задач не перечислили PID 4476 (хотя был другой процесс с именем System с PID 4, который имел собственный набор соединений TCP, которые не включали 60001). taskkill /PID 4476 Также сообщается, что PID 4476 не может быть найден.

Есть ли способ убить этот таинственный системный процесс, чтобы освободить порт, к которому он в данный момент привязан? Что может вызвать это? Как могут быть процессы, о которых никто из Диспетчера задач, Обозревателя процессов и Taskkill не знает? Перезагрузка смогла решить проблему, но я хотел бы знать, есть ли способ исправить это без перезагрузки.

6 ответов

Я знаю, что это старая ветка, но в случае, если у кого-то еще возникла такая же проблема, у меня была...

Может случиться так, что у вашего процесса был открыт порт TCP в случае сбоя или выхода из него без явного закрытия. Обычно ОС убирает подобные вещи, но только когда запись процесса исчезает. Хотя процесс может казаться, что он больше не выполняется, существует по крайней мере одна вещь, которая может вести его учет во избежание повторного использования его PID. Это существование дочернего процесса, который не отделен от родителя.

Если ваша программа порождала какие-либо процессы во время работы, попробуйте убить их. Это должно привести к освобождению записи процесса и очистке порта TCP. Очевидно, Windows делает это, когда запись освобождается, а не когда процесс завершается, как я ожидал.

Откройте командную строку как администратор

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

*** Повторяйте шаг 2, пока не останется дочерний процесс

  1. C:\WINDOWS\system32>wmic процесс, где (ParentProcessId=1091) получить Caption, ProcessId

    Caption ProcessId

    cmd.exe 1328

2.а C:\WINDOWS\system32>wmic процесс, где (ParentProcessId=1328) получить Caption, ProcessId

  Caption  ProcessId

  conhost.exe  1128

2.b. повторяйте это до тех пор, пока не будет найдено никаких дочерних процессов

- тогда убей все дочерние процессы

  1. C:\WINDOWS\system32>taskkill /F /PID 1128 УСПЕХ: процесс с PID 9500 был прерван.

Вы пытались использовать TCPView и закрывать соединение? Я не знаю, покажет ли это связь в сценарии, который вы описываете, потому что у меня никогда не было такого со мной. Но это единственное, о чем я могу думать, если это случится снова.

Каков был процесс - коммерческое программное обеспечение или что-то доморощенное? Похоже, что порт 60001 используется некоторыми троянцами - интересно, мог ли это быть руткит или что-то, что могло бы спрятаться от ОС? Возможно, вам захочется дать этой машине хороший обзор с AV, возможно, с загрузочного носителя.

Я сталкивался с той же проблемой ранее, команда netstat -a -n windows выдала мне список открытых портов с идентификатором процесса. После этого я выбрал номер порта, который хотел закрыть соединение, а затем закрыл это соединение с помощью программного обеспечения TCPView. Это сработало для меня.

Если вы пользователь Windows, выполните следующие действия. Шаг 1. Перейдите по этому пути: Панель управления \ Все элементы панели управления \ Администрирование

Шаг 2: Нажмите на услуги

Шаг 3: Остановите нежелательные службы, работающие на желаемом порту.

ps -ef | grep имя процесса

убить связанные процессы

убить -9 пид пид

Работал в моем случае

Другие вопросы по тегам