disk-alert-kata1

仕様

dfの値のなかで50%を越えているファイルシステムがいたら警告する

bashではじめる

$ df -k
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/vg_fri-lv_root
                      39720352   6285108  33031792  16% /
tmpfs                  1544216      1452   1542764   1% /dev/shm
/dev/sda3               198337     55464    132633  30% /boot


これをパイプでつないでgrep
$ df -k | grep "30%"
/dev/sda3               198337     55464    132633  30% /boot

標準出力に出るので、mail設定したcron書いてやればいいんでないの?という投げやりなかんじ

ただ、ためしに下記ファイルを作ってみたら
$ cat disk_alert.sh
/bin/df -k \
| /bin/grep -E "[1-9].%"

$ /bin/bash ./disk_alert.sh
                      39720352   6284960  33031940  16% /
/dev/sda3               198337     55464    132633  30% /boot

こういう結果になった
長い名前が改行されてそれをgrepしているので。

$ cat disk_alert.sh
/bin/df -k -P \
| /bin/grep -E "[1-9].%"

$ /bin/bash ./disk_alert.sh
/dev/mapper/vg_fri-lv_root  39720352   6284956  33031944      16% /
/dev/sda3               198337     55464    132633      30% /boot

よさそう。数字をしきい値まであげる

$ cat disk_alert.sh
#!/bin/bash
MAILTO=root
/bin/df -k -P \
| /bin/grep -E "[5-9].%"

こんな。
ただ実行しても今50%越えているものないので何も起きない。
確かめてみる。

$ dd if=/dev/zero of=full.img bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.0336465 s, 312 MB/s

$ ls -al
total 10256
drwxrwxr-x.  3 sane sane     4096 2010-03-05 02:05 .
drwxr-xr-x. 13 sane sane     4096 2010-03-05 01:28 ..
-rw-rw-r--.  1 sane sane       65 2010-03-05 01:57 disk_alert.sh
-rw-rw-r--.  1 sane sane 10485760 2010-03-05 02:05 full.img
drwxrwxr-x.  7 sane sane     4096 2010-03-05 01:28 .git

$ sudo mkdir /mnt/full_disk

$ sudo mount -o loop ./full.img /mnt/full_disk
mount: you must specify the filesystem type

$ sudo mount -o loop -t ext4 ./full.img /mnt/full_disk
mount: wrong fs type, bad option, bad superblock on /dev/loop0,
       missing codepage or helper program, or other error
       In some cases useful info is found in syslog - try
       dmesg | tail  or so

$ dmesg |tail
EXT4-fs (loop0): VFS: Can't find ext4 filesystem

あれー?
ぐぐる

ふぉーまっとしてやる
$ mkfs.ext4 full.img

いけた
$ sudo mount -o loop -t ext4 ./full.img /mnt/full_disk

$ df -kP
Filesystem         1024-blocks      Used Available Capacity Mounted on
/dev/mapper/vg_fri-lv_root  39720352   6291672  33025228      17% /
tmpfs                  1544216      2172   1542044       1% /dev/shm
/dev/sda3               198337     55464    132633      30% /boot
/dev/loop0                9911      1116      8283      12% /mnt/full_disk

$ cd /mnt/full_disk
$ dd if=/dev/zero of=test1.img bs=1M count=1

ファイルをポコポコ作る
$ df -kP
Filesystem         1024-blocks      Used Available Capacity Mounted on
/dev/mapper/vg_fri-lv_root  39720352   6291656  33025244      17% /
tmpfs                  1544216      2068   1542148       1% /dev/shm
/dev/sda3               198337     55464    132633      30% /boot
/dev/loop0                9911      4189      5210      45% /mnt/full_disk


しきい値前で止める

ファイルに実行属性をつけて
$ chmod u+x disk_alert.sh

$ ln -s /home/sane/Documents/disk_alert/disk_alert.sh /etc/cron.d/disk_alert.sh

$ ./disk_alert.sh
でない よし

ファイル作る
$ ./disk_alert.sh
/dev/loop0                9911      5213      4186      56% /mnt/full_disk

でた!でも待ってもメールが飛ばない!今日は以上!
# umount /mnt/full_disk

つづき

$ df -kP
Filesystem         1024-blocks      Used Available Capacity Mounted on
/dev/mapper/vg_fri-lv_root  39720352   6281172  33035728      16% /
tmpfs                  1544056      1864   1542192       1% /dev/shm
/dev/sda3               198337     56135    131962      30% /boot

$ cd Documents/disk_alert/

$ ls -al
total 10260
drwxrwxr-x.  3 sane sane     4096 2010-03-05 02:51 .
drwxr-xr-x. 13 sane sane     4096 2010-03-05 01:28 ..
-rwxrw-r--.  1 sane sane       65 2010-03-05 01:57 disk_alert.sh
-rw-rw-r--.  1 sane sane 10485760 2010-03-05 02:23 full.img
drwxrwxr-x.  8 sane sane     4096 2010-03-05 02:51 .git
-rw-rw-r--.  1 sane sane        6 2010-03-05 02:51 .gitignore

$ ./disk_alert.sh

$ mount
/dev/mapper/vg_fri-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda3 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
gvfs-fuse-daemon on /home/sane/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev,user=sane)

$ sudo mount -o loop full.img /mnt/full_disk/

$ mount
/dev/mapper/vg_fri-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda3 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
gvfs-fuse-daemon on /home/sane/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev,user=sane)
/dev/loop0 on /mnt/full_disk type ext4 (rw)

$ df -kP
Filesystem         1024-blocks      Used Available Capacity Mounted on
/dev/mapper/vg_fri-lv_root  39720352   6281188  33035712      16% /
tmpfs                  1544056      2024   1542032       1% /dev/shm
/dev/sda3               198337     56135    131962      30% /boot
/dev/loop0                9911      4189      5210      45% /mnt/full_disk

$ ./disk_alert.sh

$ cd /mnt/full_disk/

$ ls -al
total 3092
drwxr-xr-x. 3 sane sane    1024 2010-03-05 02:44 .
drwxr-xr-x. 3 root root    4096 2010-03-05 02:08 ..
drwx------. 2 root root   12288 2010-03-05 02:23 lost+found
-rw-rw-r--. 1 sane sane 1048576 2010-03-05 02:30 test1.img
-rw-rw-r--. 1 sane sane 1048576 2010-03-05 02:30 test2.img
-rw-rw-r--. 1 sane sane 1048576 2010-03-05 02:30 test3.img

$ dd if=/dev/zero of=test4.img bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.00647373 s, 162 MB/s

$ df -kP
Filesystem         1024-blocks      Used Available Capacity Mounted on
/dev/mapper/vg_fri-lv_root  39720352   6281228  33035672      16% /
tmpfs                  1544056      2024   1542032       1% /dev/shm
/dev/sda3               198337     56135    131962      30% /boot
/dev/loop0                9911      5227      4172      56% /mnt/full_disk

$ ./disk_alert.sh
/dev/loop0                9911      5227      4172      56% /mnt/full_disk

$ cd /etc/cron.d/

$ ls -al
total 24
drwxr-xr-x.   2 root root  4096 2010-03-05 02:36 .
drwxr-xr-x. 117 root root 12288 2010-03-07 16:48 ..
-rw-r--r--.   1 root root   113 2010-02-19 15:51 0hourly
lrwxrwxrwx.   1 root root    45 2010-03-05 02:36 disk_alert.sh -> /home/sane/Documents/disk_alert/disk_alert.sh
-rw-r--r--.   1 root root   269 2010-02-24 13:51 smolt

$ sudo rm disk_alert.sh

$ ls -al
total 24
drwxr-xr-x.   2 root root  4096 2010-03-07 16:51 .
drwxr-xr-x. 117 root root 12288 2010-03-07 16:48 ..
-rw-r--r--.   1 root root   113 2010-02-19 15:51 0hourly
-rw-r--r--.   1 root root   269 2010-02-24 13:51 smolt

/etc/cron.d/以下のファイルの書式はcrontabと同じ書式だそうだ ぐぐった
なので、実行形式のファイルを置いてもダメ


# tail -f /var/log/cron
Mar  7 17:05:01 localhost crond[1525]: (root) BAD FILE MODE (/etc/cron.d/cron_disk_alert)

BAD FILE MODE? しょんあ
とりあえずシンボリックリンクをやめてコピーした
$ sudo cp -i cron_disk_alert /etc/cron.d/.

Mar  7 17:10:01 localhost crond[1525]: (CRON) bad username (/etc/cron.d/cron_disk_alert)
あー実行ユーザがいるのか

書き加えて
$ sudo cp -i cron_disk_alert /etc/cron.d/.

cronのlogがぐりっと動く
Mar  7 17:14:01 localhost crond[1525]: (*system*) RELOAD (/etc/cron.d/cron_disk_alert)
Mar  7 17:14:01 localhost CROND[3053]: (sane) CMD (/bin/bash /home/sane/Documents/disk_alert/disk_alert.sh)

rootあてにメール来た!
# mail
Heirloom Mail version 12.4 7/29/08.  Type ? for help.
"/var/spool/mail/root": 2 messages 2 new
>N  1 Cron Daemon           Sun Mar  7 17:14  25/1100  "Cron <sane@fri> /bin/"
 N  2 Cron Daemon           Sun Mar  7 17:15  25/1100  "Cron <sane@fri> /bin/"

成功!

& 1
Message  1:
From root@localhost.localdomain  Sun Mar  7 17:14:01 2010
Return-Path: <root@localhost.localdomain>
Date: Sun, 7 Mar 2010 17:14:01 +0900
X-Authentication-Warning: localhost.localdomain: sane set sender to root using -
f
From: root@localhost.localdomain (Cron Daemon)
To: root@localhost.localdomain
Subject: Cron <sane@fri> /bin/bash /home/sane/Documents/disk_alert/disk_alert.sh
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
X-Cron-Env: <MAILTO=root>
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/sane>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=sane>
X-Cron-Env: <USER=sane>
Status: R

/dev/loop0                9911      5213      4186      56% /mnt/full_disk

当然ながら毎分くる!
ディスクを外そう

$ df -kP
Filesystem         1024-blocks      Used Available Capacity Mounted on
/dev/mapper/vg_fri-lv_root  39720352   6282204  33034696      16% /
tmpfs                  1544056      1988   1542068       1% /dev/shm
/dev/sda3               198337     56135    131962      30% /boot
/dev/loop0                9911      5213      4186      56% /mnt/full_disk

$ mount
/dev/mapper/vg_fri-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda3 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
gvfs-fuse-daemon on /home/sane/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev,user=sane)
/dev/loop0 on /mnt/full_disk type ext4 (rw)

$ sudo umount /mnt/full_disk/

$ mount
/dev/mapper/vg_fri-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda3 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
gvfs-fuse-daemon on /home/sane/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev,user=sane)

$ df -kP
Filesystem         1024-blocks      Used Available Capacity Mounted on
/dev/mapper/vg_fri-lv_root  39720352   6282236  33034664      16% /
tmpfs                  1544056      2024   1542032       1% /dev/shm
/dev/sda3               198337     56135    131962      30% /boot

cronは毎分動いてる メールは止まった
OK!

毎朝6時1分にしてやって完了

diff --git a/cron_disk_alert b/cron_disk_alert$
index 9686f27..cf94832 100644$
--- a/cron_disk_alert$
+++ b/cron_disk_alert$
@@ -1,2 +1,2 @@$
 MAILTO=root$
-* * * * * /bin/bash /home/sane/Documents/disk_alert/disk_alert.sh$
+1 6 * * * sane /bin/bash /home/sane/Documents/disk_alert/disk_alert.sh


仕様を変更
仕様
- dfの値のなかで50%を越えているファイルシステムがいたら警告する
+ dfの値のなかで/は50越えてたらwarning, 70越えてたらcriticalを警告
+ それ以外は60越えてたらwarning, 80越えてたらcriticalを警告
+ warnはwarnに、criticalはcriticalに それぞれメールする

→kata2以降へ
Comments