ulimit(rlimit) でコアダンプ抑止できるのは core_pattern でパイプしていないときだけ

とある事情で知ったコアダンプの現状。

よくコアダンプの抑止のために ulimit -c 0 とか、systemd ならユニットファイルで↓などにする例がみられますが、

[Service]
LimitCORE=0

これが有効に働くのは /proc/sys/kernel/core_pattern でコアファイルをプログラムにパイプしていないときだけです。 今日日の systemd な環境であれば /proc/sys/kernel/core_pattern は次のようにパイプされていたりするし、

|/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h %e

abrtd でコアダンプの発生をレポートしていると次のようになっていたりするので、

|/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e %P %I %h

ulimit(rlimit) でコアダンプを抑止できる、というのは昔の話のようです。

昔の話?

逆に昔は /proc/sys/kernel/core_pattern が core とかになっていて /proc/sys/kernel/core_uses_pid の設定も反映された結果、コアダンプするとカレントディレクトリにコアファイルが pid 付きで吐き出されるため、知らないうちにコアファイルがいろんなディレクトリにまき散らされてディスクフル、などということになりかねないのでコアダンプはよほどのことが無い限り無効化するもの、という話があったようです。ただ、近年は systemd なり abrtd なりでコアファイルの行方がハンドリングされており、圧縮されて所定のディレクトリに保管されるため生の無圧縮コアファイルと比べればそれほどサイズは喰わないし、systemd なら systemd-tmpfiles で3日で消えるし、abrtd はよくわかりませんでしたが、今日日はディスクフルを恐れてコアダンプを無効化するような必要は無いようです。

おまけ

Apache の子プロセスはセグってもコアダンプしないようです。

https://httpd.apache.org/docs/2.4/en/mod/mpm_common.html#CoreDumpDirectory If Apache httpd starts as root and switches to another user, the Linux kernel disables core dumps even if the directory is writable for the process. Apache httpd (2.0.46 and later) reenables core dumps on Linux 2.4 and beyond, but only if you explicitly configure a CoreDumpDirectory.

Apache が、というよりは uid を変更するようなプログラムは素ではコアダンプしないようになっているらしいです。

参考: ユーザIDを変更するプログラムのcoreダンプ - Journal InTime(2014-02-11)