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

Lor*_*one 28 debug ulimit

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

eca*_*mur 41

在最新版本的 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
Run Code Online (Sandbox Code Playgroud)

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

int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit);
Run Code Online (Sandbox Code Playgroud)

如果您没有足够新的 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
Run Code Online (Sandbox Code Playgroud)

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