lsof 如何报告比 ulimit 所说的应该允许的数量更多的打开文件?

Ada*_*son 8 lsof ulimit max-file-descriptors

lsof 如何报告比 ulimit 所说的限制更多的打开文件?

prod_web3(i-ca0b05aa):~$ sudo lsof | wc -l
4399
prod_web3(i-ca0b05aa):~$ ulimit -n
1024
Run Code Online (Sandbox Code Playgroud)

use*_*517 9

从 ulimit 内置手册页

The ulimit builtin provides control over the resources available to the shell 
and to processes started by it on systems that allow such control.
Run Code Online (Sandbox Code Playgroud)

您的lsof命令会列出系统上所有用户的所有进程的所有打开文件。你不是在比较同类。


Ron*_*dou 7

将原始lsof调用的结果与假定的限制进行比较是一个常见的错误。

对于全局限制 ( /proc/sys/fs/file-max),您应该查看/proc/sys/fs/file-nr-> 第一个值表示使用的内容,最后一个值表示限制

OpenFile 限制是针对每个进程的,但它是针对用户定义的,请参阅命令ulimit -Hn了解用户限制并参阅/etc/security/limits.conf了解定义。通常与“应用程序用户”一起应用,例如:“tomcat”:将限制设置为 65000 到用户 tomcat,这将应用于它运行的 Java 进程。

如果要检查对进程应用的限制,请获取其 PID,然后执行以下操作:cat /proc/${PID}/limits 如果要检查进程打开了多少文件,请获取其 PID,然后获取 od:(ls -1 /proc/{PID}/fd | wc -l注意:对于 ls,它是“减一”,不要与“减号”混淆)

如果您想了解详细信息,lsof但仅适用于那些计入限制的文件处理程序,请尝试使用这些命令:

  • lsof -p ${PID} | grep -P "^(\w+\s+){3}\d+\D+"
  • lsof -p ${PID} -d '^cwd,^err,^ltx,^mem,^mmap,^pd,^rtd,^txt' -a

备注:“文件”是文件/管道/tcp连接/等。

请注意,有时您可能需要成为 root 用户或使用它sudo来获取命令的正确结果。没有特权,有时您不会有错误,只是结果较少。

最后,如果您想知道某个进程访问了文件系统上的哪些“文件”,请查看: lsof -p {PID} | grep / | awk '{print $9}' | sort | uniq

玩得开心 !


est*_*ani 5

虽然这已经很旧了,但我想问同样的问题......在我的情况下答案并不令人满意,因为发生的情况是:

$ sudo su tomcat -c "ulimit -n"
1024
$ lsof -u tomcat
3967
Run Code Online (Sandbox Code Playgroud)

我不完全确定为什么会发生这种情况。我猜想子进程中打开的文件不会在父进程中得到考虑。