Mac 上的终端未使用各种 PID 相关命令提供响应

Mac 上的终端未使用各种 PID 相关命令提供响应

当我尝试使用以下任一命令查找端口的 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右侧较远位置的列(它可能会环绕在正常大小的终端窗口中)。

相关内容