ファイルシステムのチェックツールというよりは、特定のファイルやディレクトリの検知や、不足している場合の自動修正を目的としたスクリプトです。
- プログラムが残す一時ファイルの検知。一定時間経過している場合の削除。(check_tmp_agent)
- PHP session.save_path のディレクトリ自体が削除された場合の検知と再作成。(check_tmp_php)
- 再送待ちのメールが一定数溜まった場合に、sendmail を再起動して押し出す。(check_mqueue)
この手のスクリプトは、稼働しているサーバの性格・目的に応じてサブルーチンを改変していけば、限りなく運用手数が減ります。その一例です。
#!/usr/bin/perl -w # # fscheck.pl # #// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= #// use Module #// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= use strict; #// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= #// Controller #// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= #// ---------------------------------------------------------- #// Option Parse #// ---------------------------------------------------------- my @basename = split(/\//, $0); my $basename = pop(@basename); #// ---------------------------------------------------------- #// Item Set #// ---------------------------------------------------------- my $item = { mkdir => '/bin/mkdir', cat => '/bin/cat', chmod => '/bin/chmod', ps => '/bin/ps', hostname => '/bin/hostname', mail => '/usr/bin/mail', awk => '/usr/bin/awk', grep => '/usr/bin/grep', chown => '/usr/sbin/chown', tail => '/usr/bin/tail', mailq => '/usr/local/bin/mailq', term => 5, count => 100, script => '/usr/local/etc/rc.d/sendmail.sh', maddr => 'trouble@example.jp', base => $basename, file => '/tmp/.' . $basename }; #// ---------------------------------------------------------- #// Start #// ---------------------------------------------------------- #// List my $host = `$item->{hostname}`; chomp $host; $item->{host} = $host; my $log = ''; $item = check_tmp_agent($item); $item = check_tmp_php($item); $item = check_mqueue($item); if ($item->{log}) { report($item); } #// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= #// Model #// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= sub utime2date { my ($sec, $min, $hours, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($_[0]); my $years = $year + 1900; my $this_mon = sprintf("%02d",$mon + 1); $mday = sprintf("%02d", "$mday"); $hours = sprintf("%02d", "$hours"); $min = sprintf("%02d", "$min"); $sec = sprintf("%02d", "$sec"); my $date = "$years/$this_mon/$mday $hours:$min:$sec"; return $date; } sub check_tmp_agent { my ($item) = @_; my @file = `ls /tmp/.user*`; foreach (@file) { chomp; next unless ( -e $_ ); my @stat = stat($_); my $mtime = $stat[9]; my $time = time(); if ($time > $mtime + ($item->{term} * 60)) { unlink($_); $item->{log} .= utime2date($mtime) . " => $_ (unlink)\n"; } } return $item; } sub check_tmp_php { my ($item) = @_; my $dir = '/tmp/php/'; unless ( -e $dir ) { my $time = time(); `$item->{mkdir} $dir`; `$item->{chown} www:www $dir`; `$item->{chmod} 700 $dir`; $item->{log} .= utime2date($time) . " => $dir (mkdir)\n"; } return $item; } sub check_mqueue { my ($item) = @_; my $script = $item->{script}; my $check = `$item->{mailq} | $item->{tail} -n 1 | $item->{awk} '{print \$3}'`; chomp $check; if ($check >= $item->{count}) { my $time = time(); my $action = "$script restart"; $item->{log} .= utime2date($time) . " => mqueue ($check)\n\n$action\n"; `$action`; } return $item; } sub report { my ($item) = @_; my $host = $item->{host}; my $file = $item->{file}; my $subj = "Info: File ($host)"; open FILE, "+>$file"; print FILE $item->{log}; close FILE; `$item->{mail} -s "$subj" $item->{maddr} < $file`; unlink($file); }