我启动了一个服务器应用程序,并且想长时间运行以进行测试。不幸的是,我忘了先设置好ulimit -c unlimited
以捕获最终的崩溃并进行检查。有什么我可以做的吗?
我启动了一个服务器应用程序,并且想长时间运行以进行测试。不幸的是,我忘了先设置好ulimit -c unlimited
以捕获最终的崩溃并进行检查。有什么我可以做的吗?
Answers:
在最新版本的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 -m
,RLIMIT_AS = 9
; 完全相同ulimit -c
(在Linux上,x86-64上的RLIMIT_CORE
数值4
)。对于“无限” RLIM_INFINITY
,通常使用-1
。您应该检查/usr/include/bits/types.h
的大小rlim_t
;我假设long long
(它实际上是无符号的,但是使用带符号的类型会使“ unlimited” -1更容易阅读)。
由于Ubuntu 14.04 Trusty没有util-linux-2.21(它是2.20),因此没有prlimit
CLI命令可使用。
使用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或更高版本。
gdb
技术真的很酷。一个警告,似乎您无法为非root进程增加打开文件的数量,使其超过其硬限制,该setrlimit
调用返回-1,并且errno为22(无效参数)。