Порт UDP отображается в netstat, но не в lsof?

Порт UDP отображается в netstat, но не в lsof?

После использования 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. В этом случае процесс оказался в состоянии «выход» и его вообще нельзя было завершить, за исключением перезагрузки системы.

В ходе диагностики я обнаружил несколько интересных моментов:

  1. Узнать 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
    
  2. Процесс 50207, который отображается в netstat, делаетнетпоявляются в любых вариантах lsof, с или без sudo. Это то же самое поведение, которое задокументировано в вопросе.

  3. Процесс не может быть завершен даже с помощью 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)
    
  4. Как указано вhttps://serverfault.com/questions/85799/how-to-kill-an-exiting-process-on-os-x-state-e, похоже, что единственный способ завершить текущий процесс в MacOS — это перезагрузить систему. (Не уверен, ведет ли себя Linux по-другому.)

Все это было сделано на MacOS High Sierra (10.13.6).

Связанный контент