[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 メーリングリストの案内