Мой коллега недавно столкнулся с проблемой, когда процесс, который предположительно умер, все еще был привязан к сетевому порту, что не позволяло другим процессам связываться с этим портом. В частности, netstat -a -b
сообщал, что процесс с именем System
с PID 4476 был открыт порт 60001, за исключением того, что никакого процесса с PID 4476 не существовало, по крайней мере, насколько я мог судить.
Обозреватель процессов и диспетчер задач не указали PID 4476 (хотя был еще один процесс с именем System
с PID 4, у которого был собственный набор TCP-соединений, в который не входил 60001). taskkill /PID 4476
также сообщил, что не удалось найти PID 4476.
Есть ли способ убить этот загадочный системный процесс, чтобы освободить порт, к которому он сейчас привязан? Что может вызвать это? Как могут быть процессы, о которых не знают ни диспетчер задач, ни Process Explorer, ни тасккилл? Перезагрузка устранила проблему, но я хотел бы знать, есть ли способ исправить это без перезагрузки.
Я знаю, что это старая ветка, но если у кого-то такая же проблема, у меня была ...
Что может случиться, так это то, что у вашего процесса был открыт TCP-порт, когда он упал или иным образом завершился без явного его закрытия. Обычно ОС очищает такие вещи, но только после удаления записи процесса. Хотя может показаться, что процесс больше не запущен, есть по крайней мере одна вещь, которая может вести запись о нем, чтобы предотвратить повторное использование его PID. Это существование дочернего процесса, который не отделен от родительского.
Если ваша программа порождает какие-либо процессы во время работы, попробуйте их убить. Это должно привести к освобождению записи процесса и очистке порта TCP. По-видимому, окна делают это, когда запись выпускается, а не когда процесс завершается, как я ожидал.
Откройте командную строку от имени администратора
*** Повторяйте шаг 2, пока не исчезнут дочерние процессы.
C: \ WINDOWS \ system32> wmic процесс, где (ParentProcessId = 1091) получить Caption, ProcessId
Caption ProcessId
cmd.exe 1328
2.a. C: \ WINDOWS \ system32> wmic процесс, где (ParentProcessId = 1328) получить заголовок, ProcessId
Caption ProcessId
conhost.exe 1128
2.b. повторяйте это, пока не будут найдены дочерние процессы
- Затем убить все дочерние процессы
Вы пробовали использовать TCPView и закрыть соединение? Я не знаю, покажет ли он связь в сценарии, который вы описываете, потому что со мной такое никогда не случалось. Но это единственное, о чем я могу думать, если это повторится снова.
Каков был процесс - коммерческое программное обеспечение или что-то самодельное? Похоже, что порт 60001 используется некоторыми троянами - интересно, мог ли это быть руткит или что-то, что могло скрыть себя от ОС? Возможно, захочется хорошенько взглянуть на эту машину с AV, возможно, с загрузочного носителя.
Я столкнулся с той же проблемой раньше, команда netstat -a -n windows выдала мне список открытых портов с идентификатором процесса. Исходя из этого, я выбрал номер порта, по которому я хотел закрыть соединение, а затем закрыл это соединение с помощью программного обеспечения TCPView. Это сработало для меня.
Если вы являетесь пользователем Windows, выполните следующие шаги. Шаг 1. Перейдите по этому пути: Панель управления \ Все элементы панели управления \ Администрирование.
Шаг 2: Нажмите на услуги
Шаг 3. Остановите нежелательные службы, работающие на желаемом порту.
ps -ef | grep имя процесса
убить связанные процессы
kill -9 pid pid
Сработало в моем случае