ubuntu server 20.04 systemd服务如何生成core文件
最近服务挂了,毛都没给我留下。明明配置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
搞定