Linux 在核心生成期间压缩核心文件
在核心转储生成期间,有没有压缩核心文件的方法 如果系统中的存储空间有限,在需要立即压缩生成核心转储时,是否有办法节约存储空间Linux 在核心生成期间压缩核心文件,linux,kernel,Linux,Kernel,在核心转储生成期间,有没有压缩核心文件的方法 如果系统中的存储空间有限,在需要立即压缩生成核心转储时,是否有办法节约存储空间 理想情况下,该方法适用于较旧版本的linux,如2.6.x Linux内核/proc/sys/kernel/core_模式文件将执行您想要的操作: 将文件名设置为类似于|/bin/gzip-1>/var/crash/core-%t-%p-%u.gz的值,您的核心文件应该被压缩保存。对于嵌入式Linux系统,以下脚本更改可以通过两个步骤完美地生成压缩的核心文件 步骤1:创建
理想情况下,该方法适用于较旧版本的linux,如2.6.x Linux内核
/proc/sys/kernel/core_模式
文件将执行您想要的操作:
将文件名设置为类似于
|/bin/gzip-1>/var/crash/core-%t-%p-%u.gz的值,您的核心文件应该被压缩保存。对于嵌入式Linux系统,以下脚本更改可以通过两个步骤完美地生成压缩的核心文件
步骤1:创建脚本
touch/bin/gen\u compress\u core.sh
chmod+x/bin/gen\u compress\u core.sh
cat>/bin/gen\u compress\u core.sh
#!/垃圾箱/垃圾箱
exec/bin/gzip-f->“/var/core/core-$1.$2.gz”
ctrl+d
步骤2:更新核心模式文件
cat>/proc/sys/kernel/core\u模式
|/nuova/bin/gen\u compress\u core.sh%e%p
ctrl+d
正如其他答案所建议的,Linux内核/proc/sys/kernel/core\u模式文件是一个很好的开始:
正如文档所说,您可以指定特殊字符“|”,它将告诉内核将文件输出到脚本。正如建议的那样,您可以使用|/bin/gzip-1>/var/crash/core-%t-%p-%u.gz作为名称,但是它似乎对我不起作用。我认为原因是,在我的系统内核上,不将>字符作为输出,而可能将其作为参数传递给gzip
为了避免这个问题,像其他建议的那样,您可以在我使用/home//crash/core.sh的某个位置创建文件,使用以下命令创建它,替换为您的用户。或者,您也可以明显地更改整个路径
echo -e '#!/bin/bash\nexec /bin/gzip -f - >"/home/<username>/crashes/core-$1-$2-$3-$4-$5.gz"' > ~/crashes/core.sh
编译和运行后,有两个选项,我们将看到:
分段故障(堆芯转储)
或
分段故障
如果我们看到后者,可能的原因就不多了
未设置ulimit,ulimit-c应指定内核的限制
apport或您的发行版核心转储收集器未运行,应进一步调查此问题
我们编写的脚本中有一个错误,我建议您检查一些基本转储路径,以检查其他内容是否不是下面应该创建/tmp/core.dump的原因:
sudo sysctl -w kernel.core_pattern="/tmp/core.dump"
我知道这个问题已经有了答案,但是我不清楚为什么它不能“开箱即用”,所以我想总结一下我的发现,希望它能帮助别人 请注意,仅从2.6.19开始支持此功能。如果您有一个运行较早的嵌入式系统,它可能是升级的灵感;-)同样值得嵌入式用户注意的是,大多数direct flash文件系统(yaffs、jffs2、ubifs)对文件进行透明压缩,这将实现类似的净效果。必须使用绝对路径名指定程序。看见此外,重定向“>”在这里也不起作用,您可以将gzip命令放入一个单独的shell脚本中,如“/root/core.sh”,然后echo“|/root/core.sh”>/proc/sys/kernel/core\u pattern
。@Ted,我很惊讶我忽略了完整的路径。谢谢我在busybox上也一样:应该将核心模式指定为shell脚本的参数,例如echo“|/root/core.sh%t%p%u”>/proc/sys/kernel/core\u模式
,在脚本中可以使用$1、$2、$3:/bin/gzip-f->/var/crash/core-$1-$2-$3.gz
int main (){
int * a = nullptr;
int b = *a;
}
sudo sysctl -w kernel.core_pattern="/tmp/core.dump"