欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ubuntu server 20.04 systemd服务如何生成core文件

程序员文章站 2022-03-19 23:38:33
...

最近服务挂了,毛都没给我留下。明明配置ulimit -c unlimited,而且还特地在  .bashrc 中加入。被ubuntu server 20.04的core生成机制给坑了一把。

首先查看服务的core file size到底是个啥。cat /proc/服务进程的pid/limits ,发现这个服务的Max core file size的Soft Limit 是0。果然是0。

经过查询发现,全局设置的limit对systemd服务进程不起毛作用,有效设置是在 服务.service 文件中配置。样例如下:

[Unit]
Description=A login service
After=network.target 

[Service]
Type=simple
LimitCORE=infinity
LimitNOFILE=65536
Restart=always
ExecStart=/home/so/login_server.out

[Install]
WantedBy=multi-user.target

其中的LimitCORE=infinity 就是core file size 的Soft Limit设置为unlimited。LimitNOFILE=65536设置的是Max open files。可设置参数如下:

Directive        ulimit equivalent     Unit
LimitCPU=        ulimit -t             Seconds      
LimitFSIZE=      ulimit -f             Bytes
LimitDATA=       ulimit -d             Bytes
LimitSTACK=      ulimit -s             Bytes
LimitCORE=       ulimit -c             Bytes
LimitRSS=        ulimit -m             Bytes
LimitNOFILE=     ulimit -n             Number of File Descriptors 
LimitAS=         ulimit -v             Bytes
LimitNPROC=      ulimit -u             Number of Processes 
LimitMEMLOCK=    ulimit -l             Bytes
LimitLOCKS=      ulimit -x             Number of Locks 
LimitSIGPENDING= ulimit -i             Number of Queued Signals 
LimitMSGQUEUE=   ulimit -q             Bytes
LimitNICE=       ulimit -e             Nice Level 
LimitRTPRIO=     ulimit -r             Realtime Priority  
LimitRTTIME=     No equivalent

至此,服务进程已经满足生成core的条件。但是到这依然毛都生成不了。

 

ubuntu的操蛋服务apport.service。自动生成崩溃报告,官方为了自动收集错误的。这个玩意会导致core_pattern的设置不能一直有效,只要这个服务存在,系统重新启动后就会把core_pattern改为一个特定的值,直接导致coredump无法生成。

这个服务对我们来说,基本没用,所以直接disable。修改 /etc/default/apport文件,enabled 设置为0。

最后设置core_pattern为固定值即可生成coredump。在 /etc/sysctl.conf 文件, 加入

kernel.core_pattern = /var/crash/core-%e-%p-%s

可设置参数如下:

%p - insert pid into filename 添加pid
%g - insert current gid into filename 添加当前gid
%s - insert signal that caused the coredump into the filename 添加导致产生core的信号 
%g - insert current gid into filename 添加当前gid 
%s - insert signal that caused the coredump into the filename 添加导致产生core的信号 
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间 
%h - insert hostname where the coredump happened into filename 添加主机名 
%e - insert coredumping executable name into filename 添加名字

上述设置中coredump生成目录在/var/crash,名称为core-服务进程名字-pid-导致产生core的信号。执行sudo sysctl -p, 使/etc/sysctl.conf配置生效,最后查看cat /proc/sys/kernel/core_pattern 是 /var/crash/core-%e-%p-%s

搞定

 

相关标签: linux问题分析