为正在运行的进程设置最大文件限制

kāg*_*gii 37 linux process ulimit resource-management limits

我有一个长时间运行的进程,最终会达到最大打开文件限制。我知道如何在它失败后更改它,但是有没有办法从命令行更改正在运行的进程?

Sig*_*-IO 37

作为记录在这里prlimit命令,用的util-linux的2.21介绍可以读取和修改正在运行的进程的限制。

这是 writable 的后续/proc/<pid>/limits,未集成到主线内核中。这个解决方案应该有效。

如果您还prlimit(1)没有,您可以在prlimit(2)联机帮助页中找到简约版本的代码。

  • +1 为联机帮助页中的简约版本! (2认同)

Sig*_*-IO 32

在 CentOS/RHEL 上的较新内核 (2.6.32+) 上,您可以在运行时使用 /proc/<pid>/limits 更改它:

cd /proc/7671/
[root@host 7671]# cat limits  | grep nice
Max nice priority         0                    0                    
[root@host 7671]# echo -n "Max nice priority=5:6" > limits
[root@host 7671]# cat limits  | grep nice
Max nice priority         5                    6                    
Run Code Online (Sandbox Code Playgroud)

  • *这不适用于我的 3.2 内核*。我猜你的发行版有一个特定的非官方补丁,因为我在内核的 [fs/proc/base.js] 中看不到 [这个补丁](https://lkml.org/lkml/2009/9/28/211) 的痕迹。 c](http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/fs/proc/base.c?id=v3.8)。 (7认同)
  • 在 ubuntu 12.04 上对我不起作用 (4认同)
  • “setprlimit”是面向未来的推荐方式,请参阅下一个答案 (3认同)

One*_*roi 2

您可以尝试man ulimit使用 -n 选项设置 ulimit,但是 mag 页面不会,大多数操作系统不允许设置此选项。

您可以使用设置系统范围的文件描述限制sysctl -w fs.file-max=N并使更改在启动后持续存在/etc/sysctl.conf

不过,我还建议查看该过程,看看是否确实需要在给定时间打开如此多的文件,以及您是否实际上可以关闭一些文件并在该过程中提高效率。

  • `ulimit` 不会将设置应用于_正在运行的进程_。 (2认同)