php5のフラグメントファイルを30分間隔で監視、削除するcronについて

■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