使用 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) 上完成的。