lsof 变体的不同输出

lsof 变体的不同输出

我有一个使用 MongoDB Java 驱动程序 (2.11.3) 的 Java 应用程序。我在整个应用程序中使用一个静态 MongoClient 实例,如文档中所述,它应该处理连接池。很长一段时间后(这是一个 BungeeCord,如果你熟悉 Minecraft)它会抛出 Too much open files 异常。看看

$ lsof -p 7616 -n | grep "123.456.7.8:27017" | wc -l
6

向我们显示有 16 个到端口 27017 的连接。但是当我们查看时:

$ lsof -n | grep "123.456.7.8:27017" | awk '{print $2}' | grep 7616 | wc -l
438

它向我们展示了比第一个命令更多的连接。

第一个问题是为什么这两个命令有不同的输出,第二个问题是你们中是否有人在使用 Java MongoDB 驱动程序时遇到过类似的情况。

答案1

如果没有看到您的实际输出,我无法确定,但最可能的解释是27017出现在不同的地方。您的第一个命令将列出带有 PID 的进程的文件5253,然后打印包含以下内容的所有行27017 队伍中的任何地方

您的第二个命令将打印所有打开的文件,然后您再次选择包含以下内容的所有行27017 队伍中的任何地方。我假设您实际上27017也在第二个命令中进行 grep 操作,而不是16062像您在问题中所示的那样。

无论如何,您的命令都没有专门查看 port 27017。事实上,我什至不明白为什么您期望会列出端口。lsof查看文件,而不是端口。例如,当我在系统上查找ssh的输出时,没有显示任何端口。lsof -n

无论如何,给你一个更具体的例子:

$ sudo lsof -np 7033 | head
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
COMMAND  PID   USER   FD   TYPE             DEVICE SIZE/OFF      NODE NAME
firefox 7033 terdon  cwd    DIR                8,6   491520  16646145 /home/terdon
firefox 7033 terdon  rtd    DIR                8,7   548864         2 /
firefox 7033 terdon  txt    REG                8,7   143680   1841618 /opt/firefox/firefox
firefox 7033 terdon  DEL    REG               0,30           10335506 /tmp/.glT5RaDf
firefox 7033 terdon  mem    REG                8,7 12303504   1573445 /usr/share/fonts/truetype/unifont/unifont.ttf
firefox 7033 terdon  DEL    REG                0,4          970489906 /SYSV00000000
firefox 7033 terdon  mem    REG                8,7  7470672    540090 /usr/lib/x86_64-linux-gnu/gstreamer-0.10/libgstffmpeg.so
firefox 7033 terdon  mem    REG                8,7  5177387   1580807 /usr/share/fonts/truetype/wqy/wqy-microhei.ttc
firefox 7033 terdon  mem    REG                8,7   120688    532953 /usr/lib/x86_64-linux-gnu/gstreamer-0.10/libgstvideoscale.so

您的搜索27017可以在任何字段中匹配。它可以是大小、PID、节点或其他。它也可能是另一个号码的一部分。例如:

$ printf "12345\n12" | grep 12
12345
12

正如您在上面看到的,12在两行上都匹配,而不仅仅是在形成单词的第二行上匹配。您可以使用该-w开关grep仅匹配整个单词:

$ printf "12345\n12" | grep -w 12
12

因此,由于您没有在第二个命令中通过 PID 限制输出,因此您的两个greps 可能在每行的任何位置匹配,因此,当然,您有不同的输出。

相关内容