Как я могу убить процесс, который мертв, но слушать?

Я разрабатываю приложение, которое слушает порт 3000. По-видимому, есть экземпляр, который все еще слушает порт, потому что всякий раз, когда я его запускаю, он не может создать прослушиватель (C#, TcpListener, но это не имеет значения), потому что порт уже занят.

Теперь приложение не существует в Диспетчере задач, поэтому я попытался найти его PID и убить его, что привело к этому интересному результату:

C:Usersusername>netstat -o -n -a | findstr 0.0:3000
   TCP    0.0.0.0:3000           0.0.0.0:0              LISTENING       3116

C:Usersusername>taskkill /F /PID 3116
ERROR: The process "3116" not found.

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

обновление: я запустил Process Explorer и сделал поиск 3000 и нашел это:

<Non-existent Process>(3000): 5552

Я щелкнул правой кнопкой мыши и выбрал "закрыть ручку". Он больше не находится в Process Explorer, но по-прежнему отображается в netstat и по-прежнему останавливает приложение от запуска прослушивателя.

обновление 2: найдено TCPView для Windows, которые показывают процесс как "<non-existent>". Как и с CurrPorts, ничего не происходит, когда я пытаюсь закрыть подключение в этом инструменте.

5
задан 3498DB
05.01.2023 17:37 Количество просмотров материала 2618
Распечатать страницу

16 ответов

чтобы избежать бесконечного ожидания сокета, ваша программа должна использовать функции setsockopt с параметрами SO_REUSEADDR и SO_RCVTIMEO:

SO_REUSEADDR : Allows the socket to be bound to an address that is already in use.
SO_RCVTIMEO : Sets the timeout, in milliseconds, for blocking receive calls. 
13
отвечен harrymc 2023-01-07 01:25

У нас была такая же проблема и мы использовали Process Explorer из Microsoft Sysinternals для поиска идентификатора процесса, который больше не существует.

получается, что на процесс ссылались несколько процессов DrWatson. Убийство тех процессов освободило порт. DrWatson используется для отправки дампов памяти в Microsoft, и это занимало несколько часов, потому что процесс, который разбился провел несколько десятков Гб памяти в то время.

11
отвечен David 2023-01-07 03:42

Я думаю, что вы должны дать CurrPorts попробовать

CurrPorts-это программное обеспечение для мониторинга сети, которое отображает список всех открытых портов TCP / IP и UDP на вашем локальном компьютере. Для каждого порта в списке также отображается информация о процессе, который открыл порт, включая имя процесса, полный путь процесса, сведения о версии процесса (имя продукта, описание файла и т. д.), время создания процесса, и пользователь, который его создал.

кроме того, CurrPorts позволяет закрыть нежелательные TCP-соединения, остановить процесс, который открыл порты , и сохранить информацию о портах TCP/UDP в HTML-файл, XML-файл или текстовый файл с разделителями табуляции.

currports также автоматически помечать розовым цветом подозрительные TCP/UDP порты, принадлежащие неопознанным приложениям (приложения без информации о версии и иконки)

alt text

7
отвечен Sathya 2023-01-07 05:59

вероятная проблема заключается в том, что ваш процесс запустил другой (дочерний) процесс, который унаследовал дескриптор сокета, и он все еще работает.

существуют различные способы предотвратить это, например: ProcessStartInfo.UseShellExecute = true;

5
отвечен Nick Westgate 2023-01-07 08:16

вы можете увидеть процесс в Process Explorer? Если да, то вы можете убить его оттуда, но только после того, как вы исследуете, что это на самом деле (вы можете увидеть все библиотеки DLL, загруженные в процесс)

1
отвечен Jakub Konecki 2023-01-07 10:33

попробуйте установить флаг '- b' в команде netstat. Он сообщит вам имя исполняемого файла, который использует порт. Затем найдите этот proc в диспетчере задач и убейте его там. Если это не работает post, что исполняемый файл, который держит порт открытым.

1
отвечен Ge3ng 2023-01-07 12:50

нужно упомянуть термин замешкаться здесь.

на http://msdn.microsoft.com/en-us/library/ms739165.aspx

вкратце: есть опция, которая говорит системе сокета держать сокет открытым даже после того, как он был закрыт, если неотправленные данные присутствуют.

в вашем приложении c# вы можете указать любые связанные параметры через сокет.SetSocketOption: http://msdn.microsoft.com/en-us/library/1011kecd.aspx

Так как все упомянутые вещи связаны с отправкой и клиентами, но у нас были аналогичные проблемы на работе, некоторые дальнейшие поиски радовались, что можно было бы указать опцию задержки для слушателей, как показано в Примере здесь: http://msdn.microsoft.com/library/system.net.sockets.tcplistener.server.aspx

некоторые коллеги говорили о портах, удерживаемых ОС после применения окончание / закрытие примерно на две минуты. Учитывая это, было бы интересно услышать, удерживается ли порт по прошествии определенного времени.

1
отвечен Andreas 2023-01-07 15:07

Я также сталкиваюсь с этой проблемой. Наконец-то я нашел причину. Это вызвано главным процессом, вызванным дочерним процессом popen в c / c++. Но основной процесс аварии / выключения перед вызовом pclose. Тогда порт будет относиться к основному процессу все еще в прямом эфире и по-прежнему слушать его.

1
отвечен lorry.lee 2023-01-07 17:24

У меня была та же проблема с xdebug, он оставил порт 9000 открытым.

мне удалось закрыть cmd, используя "taskkill /pid xxxx".

pid процесса, использующего порт, можно получить с помощью "netstat-o".

моя конфигурация win 7 Home premium.

1
отвечен Christoforos 2023-01-07 19:41

У меня была такая же проблема и я ее исправил:

  • поиск PID с netstat -o
  • убить его с процессом xp

интересно отметить, что netstat иногда может возвращать pid, но не соответствующее имя исполняемого файла !

1
отвечен eka808 2023-01-07 21:58

проблема может быть вызвана, если мертвые процесс запущен один или несколько дочерних процессов. Если

BOOL WINAPI CreateProcess(
_In_opt_    LPCTSTR               lpApplicationName,
_Inout_opt_ LPTSTR                lpCommandLine,
_In_opt_    LPSECURITY_ATTRIBUTES lpProcessAttributes,
_In_opt_    LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_        BOOL                  bInheritHandles,
_In_        DWORD                 dwCreationFlags,
_In_opt_    LPVOID                lpEnvironment,
_In_opt_    LPCTSTR               lpCurrentDirectory,
_In_        LPSTARTUPINFO         lpStartupInfo,
_Out_       LPPROCESS_INFORMATION lpProcessInformation
);

был использован для запуска дочернего процесса, это зависит от значения наследования дескрипторов, так что с

bInheritHandles = false 

Windows не будет блокировать порт, если родительский процесс остановлен и клиентский процесс все еще работает.

1
отвечен V15I0N 2023-01-08 00:15

Я не предполагаю, что у вас установлен брандмауэр (или пробовали какие-либо сетевые твики Windows)?

некоторые брандмауэры демонстрируют такое поведение и могут держать порты открытыми.

Если у вас есть один, попробуйте отключить его, а затем запустить программу и закрыть его и посмотреть, что происходит.

0
отвечен William Hilsum 2023-01-08 02:32

Так как ваш процесс указан как System, скорее всего, вы можете убить его в командной строке "System". Системная учетная запись имеет больше прав, чем обычный администратор.

вы можете получить "System" cmd.exe путем планирования задачи для cmd.exe (планировщик работает как система):

at 15:23 /interactive "cmd.exe" 

измените это время на что-то в ближайшем будущем. Убедитесь, что вы также находитесь на консоли компьютера (Если вы находитесь в обычном сеансе сервера терминалов, вы не увидите новый cmd.исполняемый. Сделай mstsc войдите в консоль). Я думаю, что есть другие способы сделать это, но это работало для меня в прошлом.

0
отвечен David Suarez 2023-01-08 04:49

У меня была такая же проблема. Процесс отлаживался, пока он разбивался, и все еще был vsjitdebugger.exe процесс в приостановленном состоянии задерживается вокруг, который, по-видимому, относится к процессу отладки. Убийство vsjitdebugger.exe процесс решил проблему.

0
отвечен gpvos 2023-01-08 07:06

гибридное использование TCPView и Process Explorer работало для меня;) я сначала посмотрел на идентификатор процесса, который использовал порт в TCPView. Изолировал процесс в Process Explorer и убил процесс с помощью Process Explorer.

0
отвечен Sathiya Narayanan 2023-01-08 09:23

видел аналогичную проблему, когда основной причиной был какой-то дочерний процесс, созданный наследование портов, родительский процесс разбился, в то время как дочерний процесс все еще держит порт. Решение состояло в том, чтобы определить дочерний процесс, все еще работающий и остановить его. В данном примере несуществующий PID процесса был 7336

> wmic process get processid,parentprocessid | findstr/i 7336
7336             23828

остановить этот процесс:

> taskkill /f /pid 23828

и это решило проблему.

0
отвечен Michael 2023-01-08 11:40

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх