最近服务挂了,毛都没给我留下。明明配置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 文件中配置。样例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | [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。可设置参数如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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
可设置参数如下:
1 2 3 4 5 6 7 8 | %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
搞定