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

1년 남짓 후에 이 문제에 다시 부딪혔지만 이번에는 더 깊이 진단했습니다. 이번에는 팬텀 포트 바인딩 프로세스가 Mosh가 아닌 Java였으며 UDP 대신 TCP를 사용하고 있었습니다. 이 경우 프로세스는 "종료" 상태로 판명되었으며 시스템 재부팅을 제외하고는 전혀 종료될 수 없었습니다.

진단을 하던 중 몇 가지 흥미로운 점을 발견했습니다.

  1. netstat플래그를 사용하여 PID를 볼 수 있습니다 -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)에서 수행되었습니다.

관련 정보