尽管现在的磁盘容量越来越大,但它终究有被塞满的可能,如果遇上粗枝大叶的系统管理员,磁盘被塞满的时间将变得更短。一个unix/linux运行环境,一旦遇到某个分区(也称文件系统)被塞满,后果也许会十分糟糕—我曾有过在凌晨2点起来干活的经历—分区/tmp满了,导致某个守护进程不能写入磁盘而异常终止。想必其他人也有类似的情况,怎样处理和避免这样的麻烦呢?这里有些意见供大家参考。
$ o1 r4 s2 r0 Y& f. S" ]+ ? 先谈非技术方面的因素,简单的讲就是规章制度。Linux/unix大多是公共服务器,应该禁止上传与工作无关的私人数据。某君买了一个NAS(网络附属存储)设备,4个73G的硬盘,青年人网提示本来打算做web的后台数据存储,但是,但是….后来据我所知,这个大容量磁盘不到2个月所剩空间不到20G,私下浏览,嘿!大部分数据是他私人的,他本来就有收藏废品的嗜好,难怪呢。因此在这个方面,制度应该严厉一些,避免同事放垃圾数据在公共空间。, x1 U' J5 G! O. I
磁盘上的数据可能随时增长,任何人不可能24小时盯着它,因此实现自动化监控手段是十分必要的,对于更大规模的网络环境,这也许是唯一的途径。下面是一个用perl写的监控磁盘容量的脚本(大宇对此有贡献):
/ v6 _5 O; T5 o, F. x #!/usr/bin/perl -w
- R4 |0 T* i- ~! y& j # this program will check disk capacity $full and send the warning message
9 D5 ~8 L. Z% `, A5 l* \, _ # to $email_address/ ?# R6 z( y0 ?/ b; p) k
# (set the threshold to 90 and check it in the daytime so no paging7 m; v6 E& L6 h6 O/ W: [- w/ y# c- l
# is needed)
4 R& J9 h D# J$ @4 g& @ my $email_address = ’sa@yourcom.com’;* k8 Z6 V: g6 N1 A) _. a4 O$ f
my $hostname = `/sbin/ifconfig -a|grep inet|head -1|cut -f2 -d":"|cut -f1 -d" "`;
6 f9 g3 z+ ~* O2 D, X my $dmesg = `dmesg`;9 \7 R8 @. e" X
chomp(my $now = `date +"%x %X"`);' v, E. q4 }1 d5 N9 ~8 t
my $full = 90; # the threshold to send the warning, X9 M4 J. \/ J& B! T0 d
my $warn = 95;6 t, X/ g# ]' i& T( c6 Q) ?
my $count = 0;
c0 a, N! ]) z. n& G& @3 Y# v my ($dev,$total,$used);
: m& ^. f; a, q my @df_messages = `df|grep -v proc`;
7 a9 P$ w' R) c6 `( j( T print @df_messages;9 n; ]2 _# L9 K/ F. Y2 @- w' N# u
shift(@df_messages);5 K ^7 Q( [$ w/ S2 r
foreach $message (@df_messages) {' F' x1 I$ f; V& }
chomp($message);0 ]3 I- q/ T; `4 R2 {* s; c; s
($dev, $total, $used, $available, $capacity, $mount) = split(/\s+/, $message);
: w6 L# M" i* D; x& y5 q! Z $capacity =~ s/(\d+)\%/$1/;
9 h& W1 V( v9 N a, s# Z) K if ($capacity > $full) {8 ^5 T4 B5 K, J; _9 E* c' T3 `
$available[$count] = $available;
+ s$ F9 O7 c) e5 i9 }/ c9 j $capacity[$count] = $capacity;$ b5 f# p; |+ u* {7 M
$mount[$count] = $mount;8 M& V, H& E5 E2 J
++$count;
* m" O1 `; k8 W $email_address = ’sa@yourcom.com’ if ($capacity > $warn);% ~, c/ m! D: S6 F8 k7 y% u
}' r: Z5 Z6 O5 Y9 d! P, x
}
2 j v) y _# q if ($count > 0) {
5 m( w/ u5 ^3 k& Y open(MAIL, "|/usr/sbin/sendmail -t");
. _: Q+ P; {( x5 K: f print MAIL "To: $email_address \n";% d8 W* `9 J% z" A* C+ }/ C
print MAIL "Subject: Disk almost full on $hostname ($now)\n";9 E) e+ S( h" U
print MAIL "\n";" a o- o) R5 U; c. ]8 z
for ($i = 0; $i < $count; ++$i) {( G$ S2 C! L+ k9 l( z$ }2 s
print MAIL "There are only $available[$i] KB ($capacity[$i]\% full) left on $mount[$i] \n";: p/ m+ M" e* _! W1 ]
}1 u# v7 }, W3 r
} q, T) s& h* @9 z- z
if ( $dmesg =~ m/ERROR/ )
6 F/ p- s# E! d/ l5 u4 k: B {* E2 T' q U. c/ {3 ~7 C$ P' [
open(EMAIL, "|/usr/sbin/sendmail -t") or die "Can’t fork for sendmail: $!\n";
# y/ Z/ G7 }& G. L print EMAIL |