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

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

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

Random Select

My Select (2013/05/20)
今日から 4 ヶ月振りの沖縄出張で 2 週間滞在します。05/01 から沖縄支店 (? てぃーだスクエア) で始まった てぃーだ社員食堂 に興味津々です。開始日からしばらくはブログや facebook
サバ (5)
一昨日 いさば (日替りランチ 特大アジの開き) で大満足した 3 週間程前にも 日本一美味しいサバの塩焼き を食べに行っていました。珍しく 2 ヶ月も銀座を訪れていなかったのですが、CHANEL G
TEJ-75 + Marshall
My Guitar でスタジオインした時の別カットです。プラグを差し替えて音を出せば、気分は PATA (X) 全開。前回 17, 8 年ぶりに行ってからあっと言う間に 6 ヶ月過ぎているので、近々行
青い空と海のビール (1)
夏季限定醸造生ビール 夏いちばん や アサヒオリオン 沖縄だより を試していた頃、コンビニエンスストアで 青い空と海のビール « ヘリオス酒造株式会社 を見かける様になりました。Weize
牛赤身ひき肉 (9)
自宅 de タコライス (S&B タコスシーズニング Part 1) の続きです。タコスミートS&B タコスシーズニング は 1 パックに 2 袋入りで、1 袋 (8g) をひき肉 1
Rack Sample 0
ここ数年、"理想のファイルシステムとは何か" というテーマで考え続けています。機器単体では RAID (Redundant Arrays of Independent Disks)
クリーミー生サーバー (6)
うまい ! がすごい。クリーミー生サーバー (Part 2) の続きです。正確には覚えていませんが、キャンペーン終了翌日の 2013/08/26 から 1 ヶ月程経過してようやく届きました。中々の大ぶ
つけ麺 (中) + 薬味ねぎ
三田製麺所 (ちょこっと野菜) から 1 年近く時間が空きましたが、久しぶりに 三田製麺所 を訪れました。消費税率の変更に伴う金額変更以外、特にメニューに変わった様子もありません。トッピングは、チャー
radserv ZG1
現在 Drive Network で使用している主な機器の LAN Port と FreeBSD デバイス名の紐付けを整理しました。各機器共通事項として、em0 : ケーブル 白em1 : ケーブル
肉カレーうどん (大盛)
記事の投稿は 1 年以上空きましたが、その後も定期的に通っています。いつもたいてい 14 時を過ぎたあたりに訪れますが、やや早く着いてしまうともう 14 時前だというのにこの行列。この日は 30 人近
Valid HTML5 Valid CSS3 Another HTML Lint