2007年12月13日木曜日

Railsのlogファイルとsessionファイルを何とかする

Railsを運用するときに注意しないといけない、logファイルとsessionファイルを削除するシェルをcronに登録する。

参考ページ
CHNの中の人たちブログ
EMIT-Japan WebCT レター
cron の設定ガイド

■私はCentOS環境ですが。

logファイルをlogrotateで日毎の世代管理に切り替える
今回は、日毎、14世代、圧縮しない、の条件でした。

# Rails logs:
/path/to/your/rails/home/log/*.log {
daily #毎日
missingok #ファイルが存在しなくてもエラーにしない
rotate 14 #14日分を保持
nocompress #圧縮しない
notifempty #ファイルが空なら対象外
copytruncate #元のコピーでローテファイルを作成し、元ファイルをクリアする(※重要)
create 0666 hoge hoge #権限666 グループhoeg 持ち主hogeで作成
}

以上の内容を/etc/logrotate.confの後ろに書き足す。
※重要:railsが新しいファイルではなくリネームされた方に書き込み続けてしまうため必要。

■logrotateのテスト

正常にローテーションするかチェックしてみる。
直接コマンド起動 logrotate /etc/logrotate.conf

うまくローテファイルが出来ていれば、OKなようです。
logファイルはこれでまずよしとする。

■ここまでユーザはrootですよ

3日間アクセスの無いセッションファイルを削除する。
こちらは、任意の名前(railsclean)でシェルを作成しましょう。

#!/bin/sh

FIND="/usr/bin/find"
START_DIR="/path/to/your/rails/home" # 検索を始めるディレクトリ
PATH_PATTERN="*/tmp/sessions/ruby_sess*" # 削除するパターン
CONDITION="-atime +3" # 3日以上アクセスされてないファイル
EXEC="-exec rm {} ;" #分かりにくいけど{}のあとに半角スペースは必要
#EXEC="-ls" # テスト用

${FIND} ${START_DIR} -type f -path "${PATH_PATTERN}" ${CONDITION} ${EXEC}

作成したファイルに実行権限つける
[root@mycentos ~]#chmod 755 railsclean


cronに登録する。
crontabをみてみると以下のようになっていて、時間、日、週、月ごとに実行してくれるようになっているはず。
[root@mycentos ~]#cat crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
31 * * * * root run-parts /etc/cron.hourly #毎時31分に実行
32 6 * * * root run-parts /etc/cron.daily #毎日6時32分に実行
52 6 * * 0 root run-parts /etc/cron.weekly #毎週日曜日の6時52分に実行
12 7 1 * * root run-parts /etc/cron.monthly#毎月1日の7時12分に実行


今回は、/etc/cron.dailyディレクトリに先ほどのファイルを置いた。

■railscleanのテスト

明日の朝まで待ってもいいけど、テストで記述したとおりシェルが動くか確認したいので
/etc/cron.hourlyディレクトリにrailscleanを置いてみたらすぐ確認できる。