Home » FreeBSD » FreeBSD File System Check Tool (Tag: , )

ファイルシステムのチェックツールというよりは、特定のファイルやディレクトリの検知や、不足している場合の自動修正を目的としたスクリプトです。

  • プログラムが残す一時ファイルの検知。一定時間経過している場合の削除。(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);
}

Random Select

サーモン西京焼 (1)
いさば (サバ) から時間を空けずに訪れました。今日こそは、気にはなりつつも試していなかったサーモン西京焼 + 納豆 + のりで豪華ランチ (?) と決め込んで訪れました。地下の入口に下る途中に、おそ
ユーグレナモール
石垣島は、西表島や 与那国島 への経由で旧石垣空港や離島ターミナルを利用したのみで、島内を観光したことはありませんでした。それが今回、ゴールデンウィーク中に石垣島を訪れることになりました。ゴールデンウ
eco かまど (2)
以前、伊賀焼の土鍋 かまどさん で炊き上げた白米の美味しさに驚き、近いうちに自宅でもと思いつつ半年が経過してようやく購入しました。"かまどさん" より炊き上げ時間が短く済む eco
築地食堂 源ちゃん メニュー (2015/05/15)
築地食堂 源ちゃん (和風おろしハンバーグと海老フライ定食) から半年近く過ぎましたが、念願だった飲み会利用の機会に恵まれました。お刺身や焼き魚の新鮮さや美味しさは、きっと期待に応えてくれる予感がしま
Healthy Smoothies
休日 (03/31) の朝、腸まで届くビフィズス菌について調べていたところ、常識を覆す記事を見掛けました。ビフィズス菌は大腸癌ができやすい腸で殖える (キャッシュ のみ参照可能の場合あり)乳製品は人類
肉野菜炒め定食 (3)
23 年通っている とちぎや で とちぎや (生姜焼き定食) 以外のメニューを初めてオーダーするべく、再び訪れました。日替わりの "サービス定食" は今までまったくのノーマークでし
生姜焼き定食 (2015/04/22)
日本一美味しい豚の生姜焼き でご紹介した とちぎや は、通い始めて 23 年になりました。20 歳頃、とちぎやのそばにあるマクドナルドで 2 年近くバイトしていた時は、それこそ自宅のキッチン代わりに足
豚骨塩 チャーシューメン (1)
哲麺 (豚骨味噌 白髪ネギラーメン 味こいめ 脂あっさり) に続いて、今度は豚骨塩に挑戦です。普段はカウンターの奥側の席が多いですが、入口近くには不思議な絵柄の貼り紙が目に付きました。2014/11/
揚げずにからあげ (鮭) + 釜揚しらす
揚げずにからあげ (鮭 Part 1) の続きです。今回の調理に用意したかの様にちょうど良いサイズのフライパンがありました。小さじ 2 杯程のサラダ油を引いて熱した後、いよいよ焼き始めます。並べる前に
パワーストーン
与那国島から帰ってきた 10/08 (与那国島 (No. 15 ? また来るさ)) は昼過ぎの到着でしたので、ホテルのチェックインまで時間が空くこともあり、以前の仕事仲間と南部にランチに行きました。移
Valid HTML5 Valid CSS3 Another HTML Lint