Shell脚本实现系统监视统计与数据备份

知识内容:
*管理统计信息
*执行备份
*管理用户
对于linux SA来说,没啥比shell脚本编程更有用的了。linux系统每天都有很多任务需要做好,从监视系统

磁盘空间、系统用户到备份系统重要文件。通过shell脚本可以使得工作变得非常轻松和高效!
1、监视系统统计信息
确保系统的正常运行是linux SA的核心任务之一,这就需要通过创建shell脚本来监视多种不同的系统的统计
信息,甚至不需要人工干预、半夜三更执行系统脚本。
1.1、必须函数
要自动监视系统的磁盘空间,首先要使用可以显示磁盘空间使用情况的命令df:
[root@wzp ~]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda3              7033724   4463456   2207200  67% /
/dev/sda1               101086     11301     84566  12% /boot
tmpfs                   257700         0    257700   0% /dev/shm
这里头我主要提取根目录磁盘使用率即可,即67%这个数据。
这样一来,我们就需要使用shell来灵活提取这个数据了:
首先我们必须把第二行提取出来,之后再提取67%这个数据,所以我们一步一步来分析。
由于磁盘空间使用情况的数据都是变化的,唯独不变的就是文件系统/dev/sda3和最后的/,所以我们有两种
方式提取出这一行:
[root@wzp ~]# df | sed -n '/\/dev\/sda3/p'
/dev/sda3              7033724   4463456   2207200  67% /
要知道,对于正斜杠需要通过转义的,把含有/dev/sda3文本匹配行输出到STDOUT
[root@wzp ~]# df | sed -n '/\/$/p'
/dev/sda3              7033724   4463456   2207200  67% /
我们知道这一行唯独以根(/)符号结尾,所以可以把以根(/)符号结尾的行提取出来
通过如上任意一种方法,我们都做好了第一步的准备,接着就是把67%提取出来,要知道,这个67的数据可以
一直处于改变之中,所以不可以使用67这个关键数据。很明显,对于这个数据放置第五位,所以通过$5很容易就把数据提取出来了:
[root@wzp ~]# df | sed -n '/\/$/p' | gawk '{print $5}'
67%
[root@wzp ~]# df | sed -n '/\/dev\/sda3/p' | gawk '{print $5}'
67%
通过借用gawk把第五位置的数据提取,到了这里应该不难处理了,就是去掉%符号:
[root@wzp ~]# df | sed -n '/\/$/p' | gawk '{print $5}' | sed 's/%//'
67
[root@wzp ~]# df | sed -n '/\/dev\/sda3/p' | gawk '{print $5}' | sed 's/%//'
67
OK了,到这里已经实现了我们的要求,可以动态提取根目录磁盘使用情况了。
1.2、创建脚本
上面已经知道如何获取磁盘空间使用情况数据,接下来就是创建脚本了

  1. [root@wzp ~]# cat diskmonitor  
  2. #!/bin/bash  
  3. # monitor available disk space  
  4. space=`df | sed -n '/\/dev\/sda3/p' | gawk '{print $5}' | sed 's/%//'`   
  5. if [ $space -gt 90 ];then  
  6.         echo "Disk space on root at $space% used" | mail -s "Disk warning"  
  7. else  
  8.         echo "The disk space is used $space%" | mail -s "Disk space is enought"  
  9. fi 

 通过此脚本实现当根目录磁盘使用率超过90%的时候自动发报警邮件信息给root
1.3、运行脚本
[root@wzp ~]# chmod +x diskmonitor
通过给脚本赋予执行权限,然后借用crontab计划任务实现脚本定时运行
[root@wzp ~]# crontab -l
30 0,12 * * * /root/diskmonitor
实现脚本每天凌晨12点30分和中午12点30分分别执行一次脚本

2、监控磁盘资源
2.1、必须函数
如果说linux服务器上有许多用户,特别是一些文件服务器(ftp、samba),就必须对磁盘资源做好监控。
默认情况下,系统用户一般只对自家目录有存放资源的权限,所以就必须对/home目录下做数据统计:
首先可以联想到的命令应该是du了:
[root@wzp ~]# du -s /home/*
7100    /home/51cto
18684   /home/mysql
90236   /home/www
通过du命令可以很清楚的了解到各个用户自家目录磁盘使用情况(前面的数据单位是KB)
如果说/home目录下有lost+found的话可以通过grep -v lost+found来过滤掉。
接下来我们主要是提取数据和用户名,也就是说可以把/home/给去掉,做法很简单:
[root@wzp ~]# du -s /home/* | sed 's/\/home\///'
7100    51cto
18684   mysql
90236   www
为了更好的显示磁盘资源使用情况的报表,可以先对数据结果做一个排序:
[root@wzp ~]# du -s /home/* | sed 's/\/home\///' | sort -g -r
90236   www
18684   mysql
7100    51cto
通过sort -g -r(-g表示将所有数据排序;-r表示按照降序排序)实现所占磁盘空间从大到小排序。对了,还有一条就是所有用户所占磁盘总量:
[root@wzp ~]# du -s /home
116028  /home
2.2、创建脚本
通过借用临时目录创建的临时文件,将数据报表以头部、报告主体、尾部的形式显示:

  1. [root@wzp ~]# cat diskuse  
  2. #!/bin/bash  
  3. # calculate disk usage and report per user  
  4.  
  5. TEMP=`mktemp -t tmp.XXXXXX`  
  6. du -s /home/* | sed 's/\/home\///' | sort -g -r > $TEMP  
  7. total=`du -s /home | gawk '{print $1}'`  
  8. cat $TEMP | gawk -v n="$total" '  
  9. BEGIN {  
  10.         print "total disk usage by user";  
  11.         print "user\tspace\tpercent"  
  12. }  
  13.  
  14. {  
  15.         printf "%s\t%d\t%6.2f%\n", $2, $1, ($1/n)*100  
  16. }  
  17.  
  18. END {  
  19.         print "-------------------";  
  20.         printf "total\t%d\n", n  
  21. }'  
  22. rm -f $temp  
  23. [root@wzp ~]# ./diskuse  
  24. total disk usage by user  
  25. user    space   percent  
  26. www     90236    77.77%  
  27. mysql   18684    16.10%  
  28. 51cto   7100      6.12%  
  29. -------------------  
  30. total   116028 

相关推荐