2012年3月8日木曜日

コアダンプ(core dump)しない!!


コアダンプ(core dump)させる設定をしているにも関わらず、
プロセスが不正終了でダウンする時にコアを吐かなかった。
その原因を考えてみる。

前提
コアダンプの設定を確認する。

sysctl.conf にてコアファイルを生成するディレクトリと名前を決めている。
ディフォルトではプロセスのカレントディレクトリに作られるが、
専用のパーティションを作成している。
%pの位置にpid名を入れたいので、お尻に自動で付与されるpidは省略する。
SUIDされたプログラムもコアダンプさせたいため、最後の行を入れている。
# cat /etc/sysctl.conf
kernel.core_pattern=/var/core/%t-%e-%p-%c.core
kernel_core_uses_pid=0
fs.suid_dumpable=1


システム全体でコアダンプを有効にはしたくはない。
システムにログインするユーザが読み込むprofile内で無効化しておく。
# cat /etc/profile
ulimit -S -c 0 > /dev/null 2>&1


プロセスがデーモンとしてinitスクリプトで起動される場合も無効化しておく。
# cat /etc/sysconfig/init または /etc/sysconfig/デーモン名
#DAEMON_CORE_LIMIT='unlimited" ← 記載しない。ディフォルトは0。


コアを吐かせたいプロセスのみ、limits.confの設定で有効化する。
# cat /etc/security/limits.conf
test soft core unlimited
test hard core unlimited
※プロセスはtestユーザで起動するものとする。

# su - test
% ulimit -a
core file size (blocks, -c) unlimited



切り分け
設定は有効だが、起動しているプロセスがその設定を読み込んでいないのではないか。
既に起動しているプロセスの現在の設定を確認する。

プロセスIDはpsコマンドで確認してほしい。
$ cat /proc/プロセスID/limits
Limit                     Soft Limit           Hard Limit           Units
(略)
Max core file size        0                    unlimited            bytes
(略)

Hard limitはその値までSoft Limitを変更できるという制限値になる。
Soft Limitが0になっているので、これでは確かにコアダンプしない。

"ulimit -a"コマンドによる確認は今の該当ユーザの設定値がどうなっているか、である。



原因推測
limits.confの設定が読まれなかったことは間違いない。

(1) 推測1
limits.confの設定前にプロセスを起動させたのでは?
操作ログから、アプリケーションの起動前に設定済みであった。

(2) 推測2
limits.confが読み込まれない、もしくはその設定が上書きされる、
つまり別の設定が優先されるような起動手段をとったのでは?

いくつかある起動手段でlimits.confが読み込まれるかを確認する。

① サーバ起動シーケンスでプロセス起動
limits.conf の設定が使用される。

② suしてプロセス起動
limits.conf の設定が使用される。

③ cronでプロセス起動
limits.conf の設定が使用される。

④ ローカルからログインしてプロセス起動
limits.confの設定が使用されるがprofileの設定で上書きされる。

⑤ telnet、ssh等でリモートからログインしてそのまま(suしないで)プロセス起動
limits.confの設定が使用されるがprofileの設定で上書きされる。
※リモートからログインした後に、suすると②の通り再度limits.confの設定になる。
※PAMを利用するという前提である。
例えば、sshなら/etc/ssh/sshd_configファイル内でUsePAM行がyesの場合のみである。



結論
操作ログを確認すると、上の④なり⑤でプロセスを起動させていた。

/etc/profileファイルを確認する。
ディフォルトでコアを吐かない設定を入れていた。
# cat /etc/profile
ulimit -S -c 0 > /dev/null 2>&1

これが原因である。
limits.confで設定しており、④、⑤による起動手段をとる可能性があるのなら
コメントアウトしておけばいいだろう。
ただし、システム全体でコアダンプが有効になることに注意すること。



既に起動しているプロセスの設定を変えられるか
自分がログインしているbashなりのログインンシェルに対しては変更できる。
そのため、当然そのから新規に起動させるプロセスに対しても変更は効いてくる。
しかし、既に立ち上がっているプロセスのlimitsは残念ながら変えられない。