当我尝试使用以下任一命令查找端口的 PID 时(其中 xxxx 是端口号):
lsof -i tcp:xxxx
netstat -vanp --tcp | grep xxxx
sudo lsof -i -P | grep LISTEN | grep :xxxx
..我没有得到任何信息 - 终端只是将我移至下一行。我知道它在做什么,因为在执行一些命令后,系统要求我输入密码,如果我尝试关闭终端,它会警告我将停止 grep 进程(在启动它之后)。
但我没有得到任何 PID 信息 - 没有诸如“PID 是 xxxx”之类的响应。就像我刚刚按回车键一样。什么都没有。
我错过了什么?
答案1
第三个命令(启动sudo lsof
)应该可以工作(尽管效率不高)。你确定你的系统上确实有东西在监听该 TCP 端口吗?
第一个 (lsof
不带sudo
) 只能查看您拥有的进程,因此如果有系统/其他用户进程正在侦听该端口,则不会列出它。第二个 ( netstat
) 使用一堆 macOS 版本netstat
无法理解的 Linux 选项(它确实应该向您提供有关此问题的错误消息)。
要lsof
显示特定 TCP 端口上的监听内容,您可以使用其自己的选项来限制列表,而不是通过一堆grep
命令传输输出。以下是在端口 22(ssh 服务)上支持监听器的示例:
$ sudo lsof -iTCP:22 -sTCP:LISTEN
Password:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
launchd 1 root 8u IPv6 0xaf9262dbf16046f7 0t0 TCP *:ssh (LISTEN)
launchd 1 root 9u IPv4 0xaf9262dbf160ae7f 0t0 TCP *:ssh (LISTEN)
launchd 1 root 11u IPv6 0xaf9262dbf16046f7 0t0 TCP *:ssh (LISTEN)
launchd 1 root 12u IPv4 0xaf9262dbf160ae7f 0t0 TCP *:ssh (LISTEN)
请注意,只有一个进程正在监听(launchd
,进程 ID 1),但从技术上讲,它有 4 个文件描述符连接到端口,因此它们是单独列出的。
您也可以使用netstat
。它不需要sudo
查看其他用户的进程,但它只会显示进程 ID,您必须在输出中搜索相关条目。在这里,我使用awk
而不是grep
,这样我就可以让它显示列标题以及网络侦听器:
$ netstat -anv | awk '(NR<=2 || /[.]22.*LISTEN/)'
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address (state) rhiwat shiwat pid epid state options
tcp4 0 0 *.22 *.* LISTEN 131072 131072 1 0 0x0180 0x00000006
tcp6 0 0 *.22 *.* LISTEN 131072 131072 1 0 0x0180 0x00000006
请注意pid
右侧较远位置的列(它可能会环绕在正常大小的终端窗口中)。