■php5のフラグメントファイルを30分間隔で監視、削除するcronについて。
debian squeezeの場合。
$ grep ^09 /etc/cron.d/php5 | sed s/"\&\&"/"& \\\\\n"/g
09,39 * * * * root [ -x /usr/lib/php5/maxlifetime ] && \
[ -d /var/lib/php5 ] && \
find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete
■実際のところ、元々ファイルなんて存在しないが、削除スクリプトなので消えてるだけかも知れない。
$ sudo find /var/lib/php5/ -type f | wc -l
0
■if文は「/etc/php5/apache2/php.ini」が無ければ、「/etc/php5/*/php.ini」を読む。
$ sudo find /etc -type f -name "php.ini" -print
/etc/php5/cli/php.ini
/etc/php5/apache2/php.ini
■apache2がある以上、else文には落ちない。
$ which php5 >/dev/null 2>&1 && test -e /etc/php5/apache2/php.ini && echo ok
ok
■php5はapache2のモジュールとして呼ばれている。
$ dpkg -l | grep php5 | grep ^ii | awk '{print $2}'
libapache2-mod-php5
php5-cli
php5-common
php5-suhosin
■php5のモジュールは有効になっている。
$ ls /etc/apache2/mods-*/php5*
/etc/apache2/mods-available/php5.conf /etc/apache2/mods-enabled/php5.conf
/etc/apache2/mods-available/php5.load /etc/apache2/mods-enabled/php5.load
■「apache2」については、「squidguard」の304を表示する為だけにしか使っていなかったりする。
$ find /var/www/ -type f
/var/www/index.html
$ find /usr/lib/cgi-bin/ -type f
/usr/lib/cgi-bin/squidGuard.cgi
■findに渡す単位は「分」である。
$ man find | grep -A 1 "\-cmin n\$"
-cmin n
ファイルのステータスが最後に変更されたのが n 分前であれば真。
■紛らわしいことにスクリプトから渡す単位は「秒」である。
つまり、30分に一回、24分前が最後の更新であればファイルを削除します。
※「maxlifetime」の「max=1440」の一行上に「#(1440 seconds = 24 minutes),Default」とでも書けばいいのに。。。
$ grep session.gc_maxlifetime /etc/php5/*/php.ini
/etc/php5/apache2/php.ini:session.gc_maxlifetime = 1440
/etc/php5/apache2/php.ini:; setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes):
/etc/php5/cli/php.ini:session.gc_maxlifetime = 1440
/etc/php5/cli/php.ini:; setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes):
$ grep ^max /usr/lib/php5/maxlifetime
max=1440
$ grep ^echo /usr/lib/php5/maxlifetime
echo $(($max/60))
$ max=1440;echo $(($max/60));unset max
24
$ echo "1440" | awk '{print $1/60}'
24
■cronで一日にしたいなら。
上記にならって、「30分-24分」である「6分」を引いた秒数を指定する。
$ echo "60 60 24" | awk '{print ($1*$2*$3)-360}'
86040
■まずはcronを一日に一回実行とする。
$ grep ^09 /etc/cron.d/php5 | sed s/"\&\&"/"& \\\\\n"/g
09 0 * * * root [ -x /usr/lib/php5/maxlifetime ] && \
[ -d /var/lib/php5 ] && \
find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print > /var/log/php5list.log && \
find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete
■一応ログファイルは作成しておく。
$ sudo touch /var/log/php5list.log
■「/etc/php5/apache2/php.ini」の「session.gc_maxlifetime」を変更
$ sudo grep -B 5 ^session.gc_maxlifetime /etc/php5/apache2/php.ini
; After this number of seconds, stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.
; http://php.net/session.gc-maxlifetime
;session.gc_maxlifetime = 1440
session.gc_maxlifetime = 86040
■フラグメントファイルが存在しなくても、実行に影響は無い。
また、削除されなくてもfindコマンド自体が正常終了していればよい。
$ su root -c 'find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print > /var/log/php5list.log && echo ok'
ok
$ su root -c 'find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete && echo ok'
ok
$ wc -l < /var/log/php5list.log
0
■cronにテスト時間を設定、ログチェック
$ sudo grep "CRON.*php5list.log" /var/log/syslog | \
sed s/"`hostname` "//g | \
sed s/"\]\:\|\&\&"/"& \\\\\n"/g
Oct 28 22:41:01 /USR/SBIN/CRON[14463]: \
(root) CMD ( [ -x /usr/lib/php5/maxlifetime ] && \
[ -d /var/lib/php5 ] && \
find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print > /var/log/php5list.log && \
find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete)
■一日に一回ファイルサイズが「0」でなければメール報告するスクリプトで監視。
※「> /dev/null」を除けばファイルに何が記載されるかが分かる。
$ echo '#!/bin/bash
if [ "`wc -l < /var/log/php5list.log`" -ne "0" ];then
cat /var/log/php5list.log | \
mail -s "php fragment file delete" root
fi
exit 0' | sudo tee phpcheck.sh > /dev/null
■「/etc/cron.d/php5」に「&&」でつなげて記述。
$ echo '20 0 * * * root [ -x '`pwd`'/phpcheck.sh ] && '`pwd`'phpcheck.sh' | sudo tee -a /etc/cron.d/php5
29 0 * * * root [ -x /home/labunix/phpcheck.sh ] && /home/labunixphpcheck.sh
$ sudo grep "^[0-9]" /etc/cron.d/php5 | sed s/"\&\&"/"& \\\\\n\t"/g
09 0 * * * root [ -x /usr/lib/php5/maxlifetime ] && \
[ -d /var/lib/php5 ] && \
find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print > /var/log/php5list.log && \
find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete && [ -x /home/labunix/phpcheck.sh ] && \
/home/labunixphpcheck.sh
■テスト実行
「maxlifetime」が返す値が、「/etc/php5/apache2/php.ini」によって上書きされた。
$ /bin/bash -x /usr/lib/php5/maxlifetime
+ max=1440
+ which php5
+ '[' -e /etc/php5/apache2/php.ini ']'
++ php5 -c /etc/php5/apache2/php.ini -d 'error_reporting='\''E_ALL & ~E_DEPRECATED'\''' -r 'print ini_get("session.gc_maxlifetime");'
+ cur=86040
+ '[' -z 86040 ']'
+ '[' 86040 -gt 1440 ']'
+ max=86040
+ echo 1434
1434
+ exit 0
■apache2でphp5を使うコンテンツは今のところないが、これで様子見とする。
本当に使っていない(フラグメントファイルの一覧の報告メールが無い)ならば、
apache2の設定でphp5を無効にすればよい。
※無効にする方法は、シンボリックリンクなので削除するだけ。
$ ls -l /etc/apache2/mods-enabled/php5.*
lrwxrwxrwx 1 root root 27 2012-10-21 21:29 /etc/apache2/mods-enabled/php5.conf -> ../mods-available/php5.conf
lrwxrwxrwx 1 root root 27 2012-10-21 21:29 /etc/apache2/mods-enabled/php5.load -> ../mods-available/php5.load