ファイルシステムのチェックツールというよりは、特定のファイルやディレクトリの検知や、不足している場合の自動修正を目的としたスクリプトです。
- プログラムが残す一時ファイルの検知。一定時間経過している場合の削除。(check_tmp_agent)
- PHP session.save_path のディレクトリ自体が削除された場合の検知と再作成。(check_tmp_php)
- 再送待ちのメールが一定数溜まった場合に、sendmail を再起動して押し出す。(check_mqueue)
この手のスクリプトは、稼働しているサーバの性格・目的に応じてサブルーチンを改変していけば、限りなく運用手数が減ります。その一例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 | #!/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 ); } |