在正在运行的进程上设置 ulimit

在正在运行的进程上设置 ulimit

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

答案1

在较新版本的 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

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

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

如果您没有足够新的 Linux 版本(或其他操作系统),我知道的唯一解决方法是使用调试器连接到该进程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 -m, ;与 x86-64 上的 Linux 上的( ,数值RLIMIT_AS = 9) 完全相同。对于“无限制”,通常使用。您应该检查的大小;我假设(它实际上是无符号的,但使用有符号类型使“无限制”-1 更易于阅读)。ulimit -cRLIMIT_CORE4RLIM_INFINITY-1/usr/include/bits/types.hrlim_tlong long

答案2

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

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

一行:

# 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 或更高版本。

相关内容