[Armadillo:07853] 最新のN個のcoreファイルを残す

email@hidden
2012年 1月 25日 (水) 21:56:17 JST


小松平です。

最新のN個のcoreファイルを/var/coreに置くシェルスクリプトを考
えてみました。

個別のcoreファイルの大きさを制限していないのはいまいち。
でもswapを使わないならたかが知れてるだろ..と割り切りました。
coreファイルのローテーション的な要望は世の中にあるはず..と思っ
てgoogleで検索してみましたが、ぱっとヒットせず。coreファイル
を使うことはあんまりないかもしれませんが、何かのお役に立てば。


==
株式会社 ビー・ユー・ジー   製品開発本部
小松平良樹 tel:011-807-6650(内線221), mailto:email@hidden



========================================
#!/bin/sh

##
# @file corefilehelper
#
# ローテーションを考えたcoreファイルヘルパー。
# 最新のcorefileleft個のcoreファイルを残す。
# coreファイルはgzipにより圧縮して格納する。
#
# 準備
# 1. /usr/sbin/corefilehelperに置く
# 2. カーネル変数を次のように設定する。/etc/init.d/rc.localで設定するでもOK
#  2-1. echo '|/usr/sbin/corefilehelper %t %p %e %s %c' > /proc/sys/kernel/core_pattern
#  2-2. echo '0' > /proc/sys/kernel/core_uses_pid
# 3. コアファイルを生成するために、/etc/init.d/rc.local, /etc/profileに
#    "ulimit -c unlimited"などと設定しておく
#
# coreファイルのファイル名は次としている。
#     core_TTTTTTTTTT_PPPP.gz
#     - TTTTTTTT ... EPOCHからの経過秒数
#     - PPPP     ... PID
#
# gdbにcoreファイルを与えると、そのcoreファイルを生成した実行ファイル名が
# わかるため、coreファイルのファイル名に実行ファイル名を入れていない。
# ホストPCでの実行例:
# ====
# $ arm-linux-gnueabi-gdb -c core_1327394695_14109
# (略)
# Core was generated by `./bar'.
# Program terminated with signal 11, Segmentation fault.
# #0  0x00008454 in ?? ()
# ====
#
# /proc/sys/kernel/core_patternで使用できる書式指定子は次のとおり。
#   %% 1つの%文字
#   %p ダンプされたプロセスのプロセスID (PID)
#   %u ダンプされたプロセスの実ユーザID (real UID)
#   %g ダンプされたプロセスの実グループID (real GID)
#   %s ダンプを引き起こしたシグナルの番号
#   %t ダンプ時刻 (1970/01/01 00:00からの秒数)
#   %h ホスト名 (uname(2)で返されるnodenameと同じ)
#   %e 実行ファイル名
#   %c ダンプサイズの上限値 (カーネル2.6.24から使用可能)
#
# 多くのヒントは"DEBUG HACKS" O'REILLYから。
#
# @author Yoshiki KOMATSUDAIRA
# @version $Id: $
# Copyright (c) 2011, B.U.G., Inc.

corefileleft=4    # 残すcoreファイルの数
coredirectory=/var/core

removeoldcores()
{
    # coreファイルを数える。
    corefilenum=0
    for cores in core_[0-9]*_[0-9]*
    do
        corefilenum=$(($corefilenum+1))
    done
#   echo "corefilenum=$corefilenum, left=$1"

    # coreファイルのファイル名にはEPOCHからの経過秒数(%t)を入れる。
    # これにより、for...でループすると、coreファイルが古い順に得られる。
    # 古いcoreファイルを消す。
    filestoremove=$(($corefilenum-$1))
    for cores in core_[0-9]*_[0-9]*
    do
#       echo ${cores}
        if [ $filestoremove -gt 0 ]
        then
#           echo "rm ${cores}"
            rm -f ${cores}
        fi
        filestoremove=$(($filestoremove-1))
    done
}

# まずsyslogに情報を出しておく。
logger "$3 crashed(signal$4), core_$1_$2.gz will be created."

# coreファイル格納用ディレクトリがなければ作り、そこへ移動する。
if [ ! -d $coredirectory ]
then
    rm -fr $coredirectory
    mkdir -p $coredirectory
    chmod 0777 $coredirectory
fi
cd $coredirectory

# ファイルシステムがcoreファイルであふれないよう、
# 古いcoreファイルをまず消す。
removeoldcores $(($corefileleft-1))

# coreファイルをgzipで圧縮してファイルに書き出す
gzip - > core_$1_$2.gz
logger "core_$1_$2.gz created."

# もしも同時に複数のcoreファイルが生成されたならば、
# 予定より多くのcoreファイルが出来上がっている。多ければ消す。
removeoldcores $corefileleft



armadillo メーリングリストの案内