尽管现在的磁盘容量越来越大,但它终究有被塞满的可能,如果遇上粗枝大叶的系统管理员,磁盘被塞满的时间将变得更短。一个unix/linux运行环境,一旦遇到某个分区(也称文件系统)被塞满,后果也许会十分糟糕—我曾有过在凌晨2点起来干活的经历—分区/tmp满了,导致某个守护进程不能写入磁盘而异常终止。想必其他人也有类似的情况,怎样处理和避免这样的麻烦呢?这里有些意见供大家参考。
: U1 G( D3 w, [5 ` 先谈非技术方面的因素,简单的讲就是规章制度。Linux/unix大多是公共服务器,应该禁止上传与工作无关的私人数据。某君买了一个NAS(网络附属存储)设备,4个73G的硬盘,青年人网提示本来打算做web的后台数据存储,但是,但是….后来据我所知,这个大容量磁盘不到2个月所剩空间不到20G,私下浏览,嘿!大部分数据是他私人的,他本来就有收藏废品的嗜好,难怪呢。因此在这个方面,制度应该严厉一些,避免同事放垃圾数据在公共空间。
% F9 M4 M6 B+ x/ x 磁盘上的数据可能随时增长,任何人不可能24小时盯着它,因此实现自动化监控手段是十分必要的,对于更大规模的网络环境,这也许是唯一的途径。下面是一个用perl写的监控磁盘容量的脚本(大宇对此有贡献):
$ I, J" r" ?1 u0 U% A) C" o5 ^. D #!/usr/bin/perl -w m) O+ N( N4 S# m/ o4 C
# this program will check disk capacity $full and send the warning message
9 v* t9 Q# l7 A E* M0 [9 j # to $email_address+ W6 O. b7 b5 T+ Z: U# o
# (set the threshold to 90 and check it in the daytime so no paging
7 {8 R% _+ L. G0 a: g, t # is needed)/ Q5 |0 X! Y) p. Q
my $email_address = ’sa@yourcom.com’;) U7 E( r" A1 E' \0 N) L
my $hostname = `/sbin/ifconfig -a|grep inet|head -1|cut -f2 -d":"|cut -f1 -d" "`;$ S' g; ]/ f8 b* i7 z; [
my $dmesg = `dmesg`;
& m6 L! u9 o) d* r* J2 ` chomp(my $now = `date +"%x %X"`);
3 h& C! o- }- w9 i9 ^: P& ~) S my $full = 90; # the threshold to send the warning* a+ ]5 l6 j0 u% t7 |8 q
my $warn = 95;
# M7 x+ s7 x" T; w my $count = 0;
2 E" h4 u5 L) u4 P+ u1 C my ($dev,$total,$used);& r. U" z. x# z: \$ ?8 N( m
my @df_messages = `df|grep -v proc`;
; u5 y8 q1 g! D* A0 t$ O/ C9 H2 r print @df_messages;
+ A1 u" X- O: S shift(@df_messages);. `% m$ ~; C3 e! `
foreach $message (@df_messages) {
8 i! F: m8 T& c/ n9 x chomp($message);8 E& f- p g% \! h
($dev, $total, $used, $available, $capacity, $mount) = split(/\s+/, $message);& i7 |* u% v* g- \
$capacity =~ s/(\d+)\%/$1/;9 C+ {6 P- o- J) s
if ($capacity > $full) {( e3 G! d& ~' M& Q6 }- f5 M
$available[$count] = $available;
" J- d8 p! h7 Q7 ]& y8 a4 B6 r $capacity[$count] = $capacity;
: G7 m0 k% ^) v- q$ A3 g4 H $mount[$count] = $mount;7 e$ ]5 s/ q9 C0 v7 u( S) I
++$count;" j' |. ` w8 P# p: s1 g; q
$email_address = ’sa@yourcom.com’ if ($capacity > $warn);- l Y# t1 H/ y$ X$ M% Q
}" q2 Q" J" j5 N
}
4 s" F2 G% n* |( v if ($count > 0) {! a9 r% d" q: H0 h. v6 e7 _
open(MAIL, "|/usr/sbin/sendmail -t");
9 R' ?; H" ^9 R# S1 V9 V print MAIL "To: $email_address \n";$ R/ _% w7 S/ [
print MAIL "Subject: Disk almost full on $hostname ($now)\n";: J: |# \) l6 k. M+ `0 [8 Y
print MAIL "\n";
1 h6 `3 i' z" |2 u5 T6 D for ($i = 0; $i < $count; ++$i) {
6 s& X, i. L' }8 D! p* u$ \ print MAIL "There are only $available[$i] KB ($capacity[$i]\% full) left on $mount[$i] \n";$ L- Y8 m; b: C0 k; W
}6 L9 r# A* ^% W. b7 Y* p
}
d O( q# Q* N" B if ( $dmesg =~ m/ERROR/ )- ]3 m; d6 t4 f, P9 `" O6 Q
{
2 f/ a0 D. m& J# k. }+ I open(EMAIL, "|/usr/sbin/sendmail -t") or die "Can’t fork for sendmail: $!\n";+ A/ |' x4 v' O2 h) P7 p( g7 V
print EMAIL |