在运行的进程上设置ulimit


25

我启动了一个服务器应用程序,并且想长时间运行以进行测试。不幸的是,我忘了先设置好ulimit -c unlimited以捕获最终的崩溃并进行检查。有什么我可以做的吗?

Answers:


39

在最新版本的Linux(自2.6.36起)上,可以使用prlimit命令和系统调用来设置任意进程的资源限制(具有适当的权限):

$ prlimit --core=unlimited: --pid $$
$ prlimit --core --pid $$
RESOURCE DESCRIPTION             SOFT      HARD UNITS
CORE     max core file size unlimited unlimited blocks

prlimit命令需要util-linux-2.21,但是您应该能够组合一个快速程序来调用prlimit系统调用,否则:

int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit);

如果您没有足够新的Linux(或其他OS)版本,那么我所知道的唯一解决方法是使用调试器连接到该进程gdb并发出setrlimit该调试器:

$ gdb -p $PID
...
(gdb) set $rlim = &{0ll, 0ll}
(gdb) print getrlimit(9, $rlim)
$1 = 0
(gdb) print *$rlim
$2 = {-1, -1}
(gdb) set *$rlim[0] = 1024*1024
(gdb) print setrlimit(9, $rlim)
$3 = 0

这是设置ulimit -mRLIMIT_AS = 9; 完全相同ulimit -c(在Linux上,x86-64上的RLIMIT_CORE数值4)。对于“无限” RLIM_INFINITY,通常使用-1。您应该检查/usr/include/bits/types.h的大小rlim_t;我假设long long(它实际上是无符号的,但是使用带符号的类型会使“ unlimited” -1更容易阅读)。


+1该gdb技术真的很酷。一个警告,似乎您无法为非root进程增加打开文件的数量,使其超过其硬限制,该setrlimit调用返回-1,并且errno为22(无效参数)。
史蒂夫·凯莱特

2

由于Ubuntu 14.04 Trusty没有util-linux-2.21(它是2.20),因此没有prlimitCLI命令可使用。

使用Python3.4 +(在Ubuntu 14.04和所有更高版本上可用)可以为正在运行的进程设置资源限制。以root身份运行:

1班轮:

# PID=966
# grep 'open file' /proc/$PID/limits
Max open files            1024                 4096                 files     
# python3 -c "import resource; resource.prlimit($PID, resource.RLIMIT_NOFILE, (2048, 12345))"
# grep 'open file' /proc/$PID/limits
Max open files            2048                 12345                files   

或更详细:

# python3
Python 3.4.3 (default, Nov 28 2017, 16:41:13) 
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import resource
>>> import os
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE)
(1024, 4096)
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE, (1369, 9999))
(1024, 4096)
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE)
(1369, 9999)

验证它是否有效:

# grep 'open file' /proc/1472/limits 
Max open files            1369                 9999                 files 

请注意,这适用于Linux 2.6.36或更高版本以及glibc 2.13或更高版本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.