UDP ポートは netstat には表示されますが、lsof には表示されません。

UDP ポートは netstat には表示されますが、lsof には表示されません。

mosh-serverMosh を使用した後、すべてのプロセスが終了した後も、 が保持している UDP ポートがまだ使用されていることに気付きました。

を実行すると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) で実行されました。

関連情報