2011年6月26日日曜日

CentOS 5.3 以降で kernel.core_pattern にパイプ指定可能

最近の Fedora や、まだ出てませんが CentOS 6 に含まれるであろう ABRT の基礎になっている kernel.core_pattern へのパイプ指定は、CentOS 5.3 以降であれば利用できます。私的には残念ですが、今のところ CentOS 5 系へ ABRT が入る見込みは無いようです。

http://www.centos.org/docs/5/html/5.3/Release_Notes/sect-Release_Notes-Kernel_Related_Updates.html

https://bugzilla.redhat.com/show_bug.cgi?id=564237

以下、簡単な使い方として、core を圧縮して /var/spool/ap_cores ディレクトリへ集約する方法の紹介です。
#!/bin/bash
#
# Name: gzip_core
#
# Setup: run sysctl -w kernel.core_pattern="|/path/to/this %t %u %g %e %p %s"
#        or add to /etc/sysctl.conf

declare -a CORE_INF=($*)

CORE_TIM=${CORE_INF[0]}
CORE_UID=${CORE_INF[1]}
CORE_GID=${CORE_INF[2]}
CORE_EXE=${CORE_INF[3]}
CORE_PID=${CORE_INF[4]}
CORE_SIG=${CORE_INF[5]}

OUTDIR=/var/spool/ap_cores

[ ! -d $OUTDIR ] && mkdir -p $OUTDIR
chmod 700 $OUTDIR

umask 077

CORE_FILE_NAME=core-$CORE_TIM-$CORE_UID-$CORE_GID-$CORE_EXE-$CORE_PID-$CORE_SIG.gz

/usr/bin/gzip -c > $OUTDIR/$CORE_FILE_NAME
これを、例えば /root/gzip_core に保存して実行権を与えて、次のように sysctl.conf に設定します。
kernel.core_pattern="|/root/gzip_core %t %u %g %e %p %s"
core が生成されれば、/var/spool/ap_cores の下に core が gzip 圧縮されて収集されます。
# ls -la /var/spool/ap_cores/
total 28
drwx------  2 root root  4096 Jun 26 19:49 .
drwxr-xr-x 17 root root  4096 Jun 26 19:26 ..
-rw-------  1 root root 13152 Jun 26 19:49 core-1309085370-0-0-a.out-7537-11.gz

対応するカーネルソースは、次のとおりです。kernel-2.6.18-128.el5 の場合。
   1446 /* format_corename will inspect the pattern parameter, and output a
   1447  * name into corename, which must have space for at least
   1448  * CORENAME_MAX_SIZE bytes plus one byte for the zero terminator.
   1449  */
   1450 static int format_corename(char *corename, const char *pattern, long signr)
   1451 {
   1452         const char *pat_ptr = pattern;
   1453         char *out_ptr = corename;
   1454         char *const out_end = corename + CORENAME_MAX_SIZE;
   1455         int rc;
   1456         int pid_in_pattern = 0;
   1457         int ispipe = 0;
   1458 
   1459         if (*pattern == '|')
   1460                 ispipe = 1;
   1461 
"fs/exec.c"

0 件のコメント:

コメントを投稿

人気ブログランキングへ にほんブログ村 IT技術ブログへ