Вопрос: Как вы освобождаете порт, который остается открытым мертвым процессом?


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

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

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


47
2017-09-14 14:35


Источник


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


Ответы:


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

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

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


53
2018-05-25 18:18



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


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

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


6
2017-09-14 14:47



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


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


1
2018-06-26 05:33





Открыть командную строку в качестве администратора

  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 process где (ParentProcessId = 1328) получить       Подпись, ProcessId

  Caption  ProcessId

  conhost.exe  1128

2.b. повторите это, пока не будут найдены дальнейшие дочерние процессы

- Затем уничтожить все дочерние процессы

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

0
2018-05-10 20:51





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

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

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


-4
2017-09-30 06:19





ps -ef | grep processname

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

kill -9 pid pid

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


-5
2018-02-21 10:47



этот вопрос касается Windows, а не Linux - longneck