我有一个使用 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 限制输出,因此您的两个grep
s 可能在每行的任何位置匹配,因此,当然,您有不同的输出。