无限核心大小的缺点?核心文件去哪儿了?

bro*_*s94 9 upstart segmentation-fault ulimit

我有一个新贵的工作,偶尔会因分段错误而崩溃,我有一些关于核心转储的问题。

首先,我应该添加一个节:

limit core unlimited unlimited
Run Code Online (Sandbox Code Playgroud)

允许无限制的内核大小是否有缺点?有限的限制会更好吗?

二、核心文件会去哪里?如果默认值不是标准或逻辑位置,我如何让它显示在其他地方?

cot*_*eyr 6

在大多数情况下,不建议使用无限制的核心转储,但从技术上讲是可以的。核心转储只有当前进程拥有的“所有内存”。所以它最多只能和你的 ram + 交换一样大。希望你有更多的可用空间。

在现实生活中,与总 ram + 交换相比,它们应该是“小”的。

文件“应该”最终出现在“当前目录”中。对于没有 chdir 的新贵任务,通常是 /. 如果他们确实更改了目录,那么您可以自己去追捕他们。但是,您可以为它们硬编码路径。

您应该能够检查/proc/sys/kernel/core_pattern“模式”。如果您将模式设置为类似的内容,echo "/var/log/core" > /proc/sys/kernel/core_pattern那么您的所有核心都应该在 /var/log 中


Mit*_*tch 6

核心文件是操作系统在进程意外终止时创建的进程映像。当程序由于错误或违反 CPU 或内存保护机制而导致行为不端时,会创建核心文件。操作系统杀死程序并创建核心文件。

该文件对于确定进程出了什么问题非常有用。默认情况下可以启用核心文件的生成,具体取决于您拥有的 Linux 发行版和版本。

如果您根本不需要核心文件,请在启动文件中设置“ulimit -c 0”。这是许多系统的默认设置;在/etc/profile你可能会发现

由于截断的文件没有实际用处,因此将 Linux 核心文件的大小设置为“无限制”。

Usage of ulimit         Action
ulimit -c               # check the current corefile limit
ulimit -c 0             # turn off corefiles
ulimit -c x             # set the maximum corefile size to x number of 1024bytes
ulimit -c unlimited     # turn on corefiles with unlimited size
ulimit -n unlimited     # allows an unlimited number of open file descriptors
ulimit -p               # size of pipes
ulimit -s               # maximum native stack size for a process
ulimit -u               # number of user processes
help ulimit             #list of other options
Run Code Online (Sandbox Code Playgroud)

核心文件放置在进程的当前工作目录中,受 JVM 进程的写权限和可用磁盘空间的约束。

根据内核级别,可以使用一个有用的内核选项来为核心文件提供更有意义的名称。作为 root 用户,选项 sysctl -w kernel.core_users_pid=1 确保核心文件具有“Core.PID”形式的名称。

ulimit -S -c 0 > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

如果你确实想要核心文件,你需要在你自己的 .bash_profile 中重置它:

ulimit -c 50000
Run Code Online (Sandbox Code Playgroud)

将允许核心文件,但将它们限制为 50,000 字节。

您可以更好地控制核心文件 /proc/sys/kernel/

例如,您可以通过以下方式消除 pid 上的标记

echo "0" > /proc/sys/kernel/core_uses_pid 
Run Code Online (Sandbox Code Playgroud)

核心文件将被命名为“核心”。人们这样做是为了让用户可以选择将名为“core”的不可写文件放在他们不想生成核心转储的目录中。那可能是一个目录(mkdir core)或一个文件(touch core;chmod 000 core)。

但也许更有趣的是,您可以这样做:

mkdir /tmp/corefiles 
chmod 777 /tmp/corefiles 
echo "/tmp/corefiles/core" > /proc/sys/kernel/core_pattern 
Run Code Online (Sandbox Code Playgroud)

然后所有的核心文件都被扔到/tmp/corefiles(如果你这样做,不要改变 core_uses_pid)。

用一个简单的脚本测试一下:

# script that dumps core 
kill -s SIGSEGV $$ 
Run Code Online (Sandbox Code Playgroud)

在 Ubuntu 下,核心文件的创建是通过文件/etc/default/collectd. 您可以通过设置来启用核心转储的创建:

ENABLE_COREFILES=1
Run Code Online (Sandbox Code Playgroud)

定位核心文件

一旦守护程序崩溃,将在其当前工作目录中创建一个文件。默认情况下,这是pkglocalstatedir,即prefix/var/lib/collectd。如果你安装了一个包,这个目录很可能是/var/lib/collectd.

资料来源:AP Lawrence 和 IBM