ファイルシステムのチェックツールというよりは、特定のファイルやディレクトリの検知や、不足している場合の自動修正を目的としたスクリプトです。
- プログラムが残す一時ファイルの検知。一定時間経過している場合の削除。(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);
}









