我在OS X 10.11.6上并尝试运行一个通常8008
在启动时侦听UDP端口的程序.
此程序通常还会在其操作期间生成几个辅助子进程,但该端口由父进程绑定.
不幸的是,退出程序时,即使程序(父级+子级)不再存在,有时端口仍保持打开状态.
当发生这种情况时,如果我再次尝试运行该程序,它自然会失败并出现EADDRINUSE
错误,在这些情况下无论我尝试什么,我发现的唯一解决方案是重启机器.
我很难相信我不能在没有重启的情况下释放端口.
这是我到目前为止运行的一些诊断(我运行和运行所有这些sudo
):
查找使用端口的进程8008
有lsof
:
$ lsof -i -n -P | grep UDP | grep 8008
Run Code Online (Sandbox Code Playgroud)
但令人惊讶的是,没有任何结果.
但是,我有更多运气netstat
:
$ netstat -tulnvp udp | grep 8008
udp4 0 0 *.8008 *.* 196724 9216 47205 0
Run Code Online (Sandbox Code Playgroud)
所以,端口确实是绑定的,罪魁祸首是pid 47205
,但是:
$ ps aux | grep 47205
Run Code Online (Sandbox Code Playgroud)
不归还任何东西.对于PID 47206
和47207
(最确定的是分配给孩子们的PID)也是如此.我还尝试过grep
(程序名称,路径等)的其他变体.
我还寻找任何流程报告47205
作为其父级:
$ ps -axo pid,ppid,command | grep 47205
Run Code Online (Sandbox Code Playgroud)
所以孩子们的过程也显然已经死了.
无法做kill
任何事情,我尝试了SIGHUP …