
После использования Mosh я заметил, что удерживаемые UDP-порты mosh-server
продолжали использоваться после завершения всех процессов.
Запуск netstat -ln
показывает, что эти порты используются:
Active Internet connections
Proto Recv-Q Send-Q Local Address Foreign Address (state)
udp4 0 0 10.0.106.61.60002 *.*
udp4 0 0 10.0.106.61.61006 *.*
Так как это OS X, netstat -p
флаг не поддерживается, поэтому я не могу найти PID процесса, т.к.https://stackoverflow.com/a/3855359указывает. Вместо этого я запускаю sudo lsof -i :61006
, который ничего не возвращает.
Хорошо... возможно, я могу вывести список всех открытых файлов с числовыми портами и именами хостов и выполнить grep по ним? sudo lsof -i -n -P | grep 61006
...Нет, снова ничего.
Очевидно, что эти порты очищаются при перезагрузке... Но проблема здесь в том, чтобы диагностировать и освободить их без перезагрузки.
Есть идеи?
решение1
Чуть больше года спустя я снова столкнулся с этой проблемой, но на этот раз диагностировал ее глубже. На этот раз фантомный порт-привязанный процесс был Java, а не Mosh, и он использовал TCP вместо UDP. В этом случае процесс оказался в состоянии «выход» и его вообще нельзя было завершить, за исключением перезагрузки системы.
В ходе диагностики я обнаружил несколько интересных моментов:
Узнать PID можно с
netstat
помощью-v
флага:$ netstat -avn Active Internet connections (including servers) Proto Recv-Q Send-Q Local Address Foreign Address (state) rhiwat shiwat pid epid ... tcp4 0 0 *.6000 *.* LISTEN 131072 131072 50207 0
Процесс 50207, который отображается в
netstat
, делаетнетпоявляются в любых вариантахlsof
, с или безsudo
. Это то же самое поведение, которое задокументировано в вопросе.Процесс не может быть завершен даже с помощью
sudo kill -9
! Проверяя его запись вps
, можно увидеть, что он находится в интересном состоянии «выход», соответствующем «?E»:$ ps aux USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND ... mxxk 50207 0.0 0.0 0 0 ?? ?E 5Aug19 0:00.00 (java)
Как указано вhttps://serverfault.com/questions/85799/how-to-kill-an-exiting-process-on-os-x-state-e, похоже, что единственный способ завершить текущий процесс в MacOS — это перезагрузить систему. (Не уверен, ведет ли себя Linux по-другому.)
Все это было сделано на MacOS High Sierra (10.13.6).