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

63

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

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

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

Адам Розенфилд
источник
Как долго вы ждали, чтобы увидеть, был ли освобожден порт? В каком состоянии было соединение (порт)? Установлено, Закрыто, Time_Wait?
Joeqwerty
@joeqwerty: мы ждали не менее 15-20 минут. К сожалению, я забыл, в каком состоянии было соединение = /.
Адам Розенфилд
20 минут звучит как проблема. В следующий раз, когда это произойдет, запустите netstat и проверьте состояние соединения, что даст вам понять, что происходит. Однако, как вы прокомментировали ответ mfinni, это может быть результатом сбоя вашего программного обеспечения \ службы.
Joeqwerty

Ответы:

58

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

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

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

Ogapo
источник
1
Спасибо, сэр. Я не могу поверить, что этот ответ так низок, тем более, что запрос Google заполнен ответами «используй TCPView / use netstat & taskkill», которые не помогают в этом случае. В моем случае мне помогло выполнение ProcessExplorer и поиск любого потерянного процесса. Отключение их решило проблему.
gwiazdorrr
3
Спасибо за Вашу подсказку !! Процесс убийства orphand действительно решил проблему.
Темная нить
Спасибо!! Это было именно то, что случилось со мной. Я убил осиротевший процесс, и порт был освобожден. Я не уверен, как искать потерянные процессы с помощью Process Explorer, но я знал имена процессов, которые были созданы, поэтому их было легко найти.
Греццо
1
У нас была такая же проблема - и с помощью Process Explorer увидел, что доктор Ватсон держал старый PID. Мы искали (Найти) порт, который служба пыталась открыть, а затем увидели 3-4 записи для доктора Ватсона и PID, который он использовал. Как ни странно, нам не нужно было ничего явно УБИВАТЬ. Похоже, этот процесс «разбудил», и он исчез. В следующий раз, когда мы попытались перезапустить службу, все получилось нормально.
tresstylez
Подобная проблема может возникнуть во время отладки с VS. Я присоединяю VS к процессу, и после некоторых циклов - описывается ситуация, но мои процессы (включая дочерние) не удаляются. Но убийство "vsjitdebugger" помогает.
Дмитрий Азараев
6

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

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

mfinni
источник
Нет, мы не пробовали TCPView; Я буду помнить это на будущее, если это когда-нибудь случится снова. Программное обеспечение - это наше собственное программное обеспечение, использующее порт 60001 - я почти уверен, что процесс, удерживающий порт открытым, был предыдущим экземпляром нашего программного обеспечения, которое каким-то образом не совсем умерло. Это препятствовало запуску другой копии программного обеспечения.
Адам Розенфилд
Ваше приложение может установить для параметра SO_REUSEADDR сокета значение true, прежде чем связывать его. Это должно решить вашу проблему (это даже более или менее обязательно для * nix)
Stephane
3

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

  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 был прерван.
Шринивас
источник
Команда wmic была единственным способом, которым нам удалось идентифицировать дочерний процесс, фактически держа наши порты открытыми. Большое спасибо.
К Эрландссон
Это был также единственный способ исправить мою проблему. Основной процесс пропал, и дочерний процесс находился в приостановленном состоянии, но все еще удерживал порт TCP в состоянии «прослушивания». Спасибо.
Gui
1

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

Elavarasi
источник
-4

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

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

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

user314053
источник
-5

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

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

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

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

ява гик
источник
6
этот вопрос о Windows, а не о Linux
longneck