我有一些 init 脚本,用于启动我编写的一些守护进程。我希望 Linux 在发生崩溃时生成核心转储。我在 /etc/security/limits.conf 中添加了下一行,从而激活了核心转储:
* hard core 100000
重新启动后,我运行 ulimit -a 并看到核心转储未被激活:
> root@computer:~# ulimit -a
> core file size (blocks, -c) 0
首先,我检查系统上是否有任何可以停用 coredump 的文件脚本(greping ulimit -c 0
),但到目前为止我没有发现任何东西。
然后,我创建了一个伪造的 C 程序……来仔细检查它是否正常工作,我可以确认它不能正常工作。该程序如下
int main() {
int *p;
return *p;
}
运行后没有产生 coredump
root@computer:~# ./a.out
Segmentation fault
我知道 coredump 有效(并且它在内核中被激活),因为在运行ulimit -c 100000
并重复上述测试后,会生成 coredump。
root@computer:~# ulimit -c 100000
root@computer:~# ./a.out
Segmentation fault (core dumped)
root@computer:~# ls
a.out core
我真的没有主意了。有什么可以帮忙的吗?
提前谢谢!
答案1
您还需要设置软核。有两组限制。来自手册页:
# cat /etc/debian_version
6.0.1
# man limits.conf:
<type>
hard
for enforcing hard resource limits. These limits are set by the superuser and enforced by the Kernel. The user cannot raise his requirement of system resources above such values.
soft
for enforcing soft resource limits. These limits are ones that the user can move up or down within the permitted range by any pre-existing hard limits. The values specified with this token can be
thought of as default values, for normal system usage.
-
for enforcing both soft and hard resource limits together.
您只需将 limits.conf 中的“hard”更改为“-”,它就可以修复此问题。或者您可以更详细地添加一个特定的 soft 行(也许将其设置得更小)。
答案2
/etc/security/limits.conf
- 软核无限
- 硬核无限
或者
- 软核 10000
- 硬核10000
不适用于我的 Debian Squeeze 服务器。
重启后:root@sla:~# ulimit -c 0
这很烦人
:'(
root@sla:~# sysctl kernel.core_pattern
kernel.core_pattern = /var/log/dumps/core.%t.%e.%p_%u-%g
我发现了问题:
在 /etc/profile 末尾:
下面这行设置了软限制,以停止创建 coredump
全部用户
ulimit -S -c 0 > /dev/null 2>&1
我替换为:
ulimit -c unlimited > /dev/null 2>&1
现在它可以工作了:D
帕斯卡