尽管此刻的磁盘容量越来越年夜,但它事实下场有被塞满的可能,如不美观赶上粗枝年夜叶的系统打点员,磁盘被塞满的侍旧双变得更短。一个unix/linux运行情形,一旦碰着某个分区(也称文件系统)被塞满,后不美观也许会十分糟糕『我曾有过在凌晨2点起来干活的履历—分区/tmp满了,导致某个守护历程不能写入磁盘而异常终止。想必其他人也有近似的情形,若何措置和避免这样的麻烦呢?这里有些定见供巨匠参考。
+ ?: w/ T1 a! W; r& E 先谈非手艺方面的身分,简单的讲就是规章轨制。Linux/unix年夜多是公共处事器,应该禁止上传与工作无关的私人数据。某君买了一个NAS(收集隶属存储)设备,4个73G的硬盘,提醒原本筹行为算作web的后台数据存储,可是,可是….后来据我所知,这个年夜容量磁盘不到2个月所剩空间不到20G,暗里浏览,嘿!年夜部门数据是他私人的,他原本就有保藏废品的癖好,难怪呢。是以在这个方面,轨制应该峻厉一些,避免同事放垃圾数据在公共空间。* w6 I4 i& [8 I1 \4 v8 p" O
磁盘上的数据可能随时增添,任何人不成能24小时盯着它,是以实现自动化监控手段是十分需要的,对于更年夜规模的收集情形,这也许是独一的路子。下面是一个用perl写的监控磁盘容量的剧本(年夜宇对此有进献):
8 W4 j2 O- N7 _5 c #!/usr/bin/perl -w
2 ]7 ?: s$ ^3 ~$ k: ] # this program will check disk capacity $full and send the warning message
" ?0 o# m O+ a # to $email_address- G3 Y; I2 S4 g' G& u$ n
# (set the threshold to 90 and check it in the daytime so no paging
# H3 h+ `. x; y/ A& Y! i0 d # is needed)) d5 J O' m# u3 m4 e$ z. b. p% `
my $email_address = ’sa@yourcom.com’;
( g) c' d* J% ~7 B; o/ L p my $hostname = `/sbin/ifconfig -a|grep inet|head -1|cut -f2 -d":"|cut -f1 -d" "`;
3 p3 F! S6 N0 y+ F/ w my $dmesg = `dmesg`;8 L+ Y5 x7 s9 Z! a# p- u$ B
chomp(my $now = `date +"%x %X"`);; V* K& }' a% t1 e3 E: ~- b& }3 t
my $full = 90; # the threshold to send the warning
& S& y" Q9 J6 Y* Y; F my $warn = 95;
: B* a' Y, T! \% n/ t my $count = 0;. _# W9 p; O9 _: i
my ($dev,$total,$used);0 T! ?, d8 g7 _7 F, X4 c3 y5 g. u8 R
my @df_messages = `df|grep -v proc`;
/ U9 h: t& r7 ~6 o! k" L print @df_messages;$ m" P+ e/ K- T! ?3 k( G
shift(@df_messages);
$ ]. n! A) P2 q2 s/ M5 c0 o foreach $message (@df_messages) {
" y. y& z4 U* E5 |/ C$ O chomp($message);
( |3 N; S. x4 l. |5 I+ D' j* [& d' N ($dev, $total, $used, $available, $capacity, $mount) = split(/s+/, $message);
, ? g, D* F/ Z/ f, A* \: b $capacity =~ s/(d+)%/$1/;
# X- m; e' v& J6 C2 t* i( l+ r if ($capacity > $full) {
9 c) O1 v( y2 m* Q$ J- Y9 e $available[$count] = $available;$ S$ U5 G2 o7 D# f" {
$capacity[$count] = $capacity;
- h* V* X6 d& r) T4 ? $mount[$count] = $mount;
6 s8 S3 p( R' P' j3 E3 s2 R3 \ ++$count;
7 \; B. o! }0 j1 ] $email_address = ’sa@yourcom.com’ if ($capacity > $warn);
/ F& D) V! I/ _* [! M }% b0 W- ~$ i4 J; [7 Q
}
. q2 t* g4 b& Y: U if ($count > 0) {
* \/ y, W& K, _1 |4 k! w* H open(MAIL, "|/usr/sbin/sendmail -t");2 o( Y" M/ }( x
print MAIL "To: $email_address n"; i# S. q7 s' _0 z; c
print MAIL "Subject: Disk almost full on $hostname ($now)n";( v0 U) E& D: p, s, |+ [' {8 M }
print MAIL "n";
6 `5 | F. [" z8 m for ($i = 0; $i < $count; ++$i) {- \/ @( p$ }$ J; Z) n6 o
print MAIL "There are only $available[$i] KB ($capacity[$i]% full) left on $mount[$i] n";
u0 b- t& M- `& f }
: G2 x1 P' f& O0 ~) l: }6 K8 g }+ T$ a# N4 ^3 \ m6 u
if ( $dmesg =~ m/ERROR/ )
6 y) J; i6 c' k2 D. G0 s! y1 l {* i( y" }2 s; y* U0 j
open(EMAIL, "|/usr/sbin/sendmail -t") or die "Can’t fork for sendmail: $!n";2 F% a' Z5 V4 y) }- [* z: n+ I M% U
print EMAIL |