a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 155|回复: 1

[红旗认证] 怎样清理被塞满的unix文件系统

[复制链接]
发表于 2012-8-4 12:16:06 | 显示全部楼层 |阅读模式
尽管现在的磁盘容量越来越大,但它终究有被塞满的可能,如果遇上粗枝大叶的系统管理员,磁盘被塞满的时间将变得更短。一个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
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:16:07 | 显示全部楼层

怎样清理被塞满的unix文件系统

  .
8 d$ q* m3 G- e5 l+ J: G- D  _EOF_
; R) R' y. y# G! _  close("EMAIL");
4 r% e3 D( n9 B; b0 C  }
# u: H$ i1 j! w" T+ A  把这个脚本放在定时任务crontab里即可实现自动监控,只要某个分区的容量达到脚本中阀值,系统就会发送报警邮件到管理员信箱,更进一步还可设定发送手机短信报警。知道某个分区快要被塞满的情况后,接下来的事情就是清理它了。登陆系统,然后使用命令df –h察看具体的磁盘使用情况(老一点版本的solaris不支持选项-h,请用-k这个选项),磁盘的利用率是以百分比的方式显示的,非常直观。找到快要被塞满的分区之后,应该先着手查找占用空间大的最大的文件,然后处理这个占用空间最大的文件。这里我用一个实例(根分区/root)来演示这个过程。
( ~0 V& @+ P8 ^  1、进入目录/root,执行命令 du –h | sort –n 就把当前目录下目录以及文件所占的大小按顺序排列出来了,一屏显示不完的话再用加一个管道 du –h | sort –n | more 就好了。
5 f  {' D1 d! c  -bash-3.00# du -h | sort -n| more1 e* }+ q* W9 h8 X; l8 \% L1 S- L
  1K ./.dt/appmanager
* z: L! S6 L. }  1K ./.dt/help
2 t1 q$ S* T5 B) y8 ^  1K ./.dt/icons
+ c% ^1 k6 F$ z! C% K+ L( P. r  1K ./.dt/tmp# k; n6 L; q. U9 }3 k
  ……….(省略若干行)! [2 p$ W( Z! f* q
  914K ./mysql-5.0.37/zlib4 E: ^; W6 r8 S
  933K ./mysql-5.0.37/ndb/src/kernel/blocks/dblqh, s  L- I, d7 q8 |% S' ~
  938K ./mysql-5.0.37/scripts0 p# S% J( r# h% j' a  h
  945M . //这个东西占太大的空间
/ J, w( t, g; E  t8 Q  957K ./mysql-5.0.37/extra/yassl/taocrypt
% \( w# P( [9 q6 n; [9 q  959K ./vsftpd-2.0.5. t$ I7 a# M0 ]
  1002K ./mysql-5.0.37/ndb/src/common4 t# C- K/ ?& o
  -bash-3.00#
4 k% C# z6 v" N4 u! K' Q" `- R  有上面的输出,我们可以知道在当前目录里有大文件,但是看不出是哪个文件。
. ]+ M. |# T) V  2、再执行命令 ls –al | grep ^- |more 就可以看见每个文件的大小。5 c. A3 c. h1 {1 m. m* A
  -bash-3.00# ls -al | grep ^-|more
0 |* |* {) N8 |  -rw------- 1 root root 810 Apr 29 09:59 .ICEauthority3 G8 L" ]( ~* S( o5 s8 x7 J9 |: h  N
  -rw------- 1 root root 98 Apr 29 09:59 .Xauthority; l) `6 l' G' k# v1 y; K) O" M  r
  -rw------- 1 root root 730 Apr 30 07:52 .bash_history! x! E* x" ]) S' M( p
  -rwxr-xr-x 1 root root 5111 Apr 29 08:30 .dtprofile7 S* x" ~) O! r# E. S/ i+ C3 Z
  -rw-r--r-- 1 root root 81 Apr 29 08:30 .gtkrc-1.2-gnome2% h2 u1 w" W8 R& q" ?
  -rw------- 1 root root 0 Apr 29 08:30 .recently-used
4 ~0 o( {3 c% P( G5 r" W1 N$ o4 H  -rw-r--r-- 1 root root 681090961 Feb 28 12:29 10202_database_solx3 H% Z8 i1 \8 J' i4 i
  86.zip" I; M9 W/ Q7 t1 k  o
  ……….(省略若干)
7 B1 F) y+ F9 S5 e6 O6 v+ O* S3 }  -rw-r--r-- 1 root root 3069440 Apr 29 11:31 tar-1.16-sol10-x86-lo
/ B; A  x. m# \1 G2 `  k. v- x  cal
7 U0 h/ ?+ b2 I) c! ], y  -rw-r--r-- 1 root root 10895360 Oct 22 2006 tar-1.16.tar2 s4 Z" m& @# ?  V6 j) P; L
  -rw-r--r-- 1 root root 155985 Jul 3 2006 vsftpd-2.0.5.tar.gz
/ S* s  F/ [1 y7 |% M/ Z9 a  P  -bash-3.00#8 n9 C9 `8 f- l; B- P, t
  字体为红色的哪行就是最大文件的信息,它的文件名是10202_database_solx86.zip,再用命令du –h 10202_database_solx86.zip可直接显示它的大小为650M。
$ O4 U, P( T& `' ]5 P  -bash-3.00# du -h 10202_database_solx86.zip
, y* D% p9 ?2 c  650M 10202_database_solx86.zip  Q# s1 g  N" R" ~$ W- Y
  3、移走或删除占用空间的大文件。+ B2 N7 x+ ^# a+ L. ~' Y1 ~" {
  大家看一看,找大文件是不是很简单?!当然如果使用awk这样的工具写shell脚本更是方便的法门,还有一个方法是用find加选项 –size,请大家自己去试验。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-4-30 00:27 , Processed in 0.149501 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表