lsof 如何报告打开文件的数量高于 ulimit 所允许的数量?

lsof 如何报告打开文件的数量高于 ulimit 所允许的数量?

lsof 如何报告打开的文件数超过 ulimit 所规定的限制?

prod_web3(i-ca0b05aa):~$ sudo lsof | wc -l
4399
prod_web3(i-ca0b05aa):~$ ulimit -n
1024

答案1

来自 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.

您的lsof命令列出了系统上所有用户的所有进程打开的所有文件。您没有进行同类比较。

答案2

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,它是“减一”,不要与“减 1”混淆)

如果您只想知道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

玩得开心!

答案3

虽然这已经是老问题了,但我还是想问同样的问题...对我来说答案并不令人满意,因为发生了以下情况:

$ sudo su tomcat -c "ulimit -n"
1024
$ lsof -u tomcat
3967

我不太清楚为什么会发生这种情况。我猜是因为子进程打开的文件没有被父进程记录下来。

答案4

bash(1) 内置命令 ulimit 定义每个进程打开的最大文件数。

从任何方面来说,这都不是一个系统范围的设置。

相关内容