
使用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。在這種情況下,該進程處於「退出」狀態,根本無法終止,除非系統重新啟動。
在診斷過程中,我發現了一些有趣的點:
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
進程 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) 上完成的。