Як ви можете звільнити порт, який він відкриває мертвим процесом?


63

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

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

Чи є спосіб вбити цей загадковий системний процес, щоб звільнити порт, до якого він зараз прив’язаний? Що може спричинити це? Як можуть бути процеси, про які не знає жоден із диспетчерів завдань, провідника процесів та завдань? Перезавантаження вдалося виправити проблему, але я хотів би знати, чи є спосіб виправити це без перезавантаження.


Скільки часу ви чекали, щоб побачити, чи був випущений порт? У якому стані знаходилося з'єднання (порт)? Встановлено, закрито, Time_Wait?
joeqwerty

@joeqwerty: Ми чекали принаймні 15-20 хвилин. На жаль, я забуваю, у якому стані було з'єднання = /.
Адам Розенфілд

20 мінусів звучить як проблема. Наступного разу, коли це станеться, запустіть netstat і перевірте стан підключення, це дасть вам уявлення про те, що відбувається. Як ви прокоментували відповідь mfinni, це може бути результатом збоїв у вашому програмному забезпеченні \ службі.
joeqwerty

Відповіді:


58

Я знаю, що це стара тема, але у випадку, якщо хтось інший має те саме питання, у мене був ...

Що може статися, це те, що ваш процес відкрив порт TCP, коли він вийшов з ладу або іншим чином вийшов з нього, не закриваючи його явно. Зазвичай ОС очищає подібні речі, але лише тоді, коли запис процесу відходить. Хоча процес, можливо, більше не працює, але існує хоча б одна річ, яка може вести облік про нього, щоб уникнути повторного використання його PID. Це існування дочірнього процесу, який не відривається від батьківського.

Якщо ваша програма породила будь-які процеси під час роботи, спробуйте їх знищити. Це повинно призвести до звільнення запису процесу та очищення порту TCP. Мабуть, Windows робить це, коли запис виходить не тоді, коли процес закінчується, як я б очікував.


1
Дякую, добрий пане. Я не можу повірити, що ця відповідь настільки низька, тим більше, що запит google заповнений відповідями "використовувати TCPView / використовувати netstat & taskkill", які не допомагають у цьому випадку. У моєму випадку те, що допомогло, було запустити ProcessExplorer та шукати будь-який процес, який був сиротою. Закриття їх вирішило проблему.
gwiazdorrr

3
Дякую за вашу підказку !! Процес вбивства сиріт справді вирішив проблему.
Darkthread

Дякую!! Саме це сталося зі мною. Я вбив сироту, і порт був звільнений. Я не впевнений, як шукати осиротілих процесів за допомогою провідника процесів, але я знав назви процесів, які породили, так що їх було легко знайти.
Греццо

1
У нас була ця сама проблема - і за допомогою Process Explorer побачив, що доктор Ватсон тримається за старий PID. Ми шукали (знайти) порт, який сервіс намагався відкрити, а потім побачили 3-4 записи для доктора Ватсона та PID, який він використовує. Як не дивно, нам не довелося неявно вбивати що-небудь. Схоже, що цей процес "прокинувся", і він зник. Наступного разу, коли ми спробували перезапустити послугу, це вийшло чудово.
tresstylez

Подібна проблема може трапитися під час налагодження з VS. Я приєдную VS до процесу, і після деяких циклів - описана ситуація трапляється, але мої процеси (включаючи дітей) не залишають. Але вбивство "vsjitdebugger" допомагає.
Дмитро Азараєв

6

Ви намагалися використовувати TCPView і закрити з'єднання? Я не знаю, чи виявиться це зв'язок у сценарії, який ви описуєте, тому що мені ніколи цього не сталося. Але це єдине, про що я можу придумати, якщо це повториться.

Який процес - це комерційне програмне забезпечення чи щось домашнє? Здається, порт 60001 використовується деякими троянами - мені цікаво, чи це міг бути руткіт чи щось таке, що могло б приховати себе від ОС? Можливо, хочете, щоб цей апарат добре перетворився з AV, можливо, щось із завантажувального носія.


Ні, ми не пробували TCPView; Я буду пам'ятати про це на майбутнє, якщо воно коли-небудь повториться. Програмне забезпечення - це наше власне програмне забезпечення, яке використовує порт 60001 - я майже впевнений, що процес, який тримає порт відкритим, був попереднім екземпляром нашого програмного забезпечення, який якимось чином не зовсім загинув. Це завадило запустити ще одну копію програмного забезпечення.
Адам Розенфілд

Ваша програма може встановити параметр SO_REUSEADDR сокета на істинне, перш ніж прив’язувати його. Це повинно вирішити вашу проблему (це навіть більш-менш обов'язково на * nix)
Стефан,

3

Відкрити командний рядок як адміністратор

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

*** Повторіть крок 2, поки не буде більше дочірнього процесу

  1. C: \ WINDOWS \ system32> wmic процес, де (ParentProcessId = 1091) отримують 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 була єдиним способом, яким нам вдалося виявити дочірній процес, фактично тримаючи наші порти відкритими. Дуже дякую.
K Ерландссон

Це також був єдиний спосіб, коли я вирішив вирішити свою проблему. Основний процес був відсутній, і дочірній процес перебуває у призупиненому стані, але все ще тримав порт TCP зі станом "Слухання". Дякую.
Гі

1

Раніше я стикався з тією ж проблемою, команда netstat -a -n Windows надала мені список відкритих портів з ідентифікатором процесу. З цього моменту я взяв номер порту, який я хотів закрити, а потім закрив це з'єднання за допомогою програмного забезпечення TCPView. Це працювало для мене.


-4

Якщо ви користувач Windows, то виконайте наведені нижче кроки. Крок 1. Перейдіть до цього шляху: Панель управління \ Усі елементи панелі управління \ Адміністративні інструменти

Крок 2: Клацніть на сервісах

Крок 3. Зупиніть роботу небажаних служб на потрібному порту.


-5

пс -еф | grep назва імені

вбивати пов'язані з цим процеси

вбити -9 pid pid

Працював у моєму випадку


6
це питання стосується Windows, а не Linux
longneck
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.