8.12 监视远程磁盘的健康情况

网络是由不同用户的多台主机组成。它需要对远程主机的磁盘使用情况进行集中监视。网络系统管理员得每天记录网络中所有主机的磁盘使用。日志的每一行应该包含日期、主机IP地址、设备、设备容量、占用空间、剩余空间、使用比例、健康状况等细节信息。如果任何远程主机中的任意分区使用率超过了80%,那么健康状态应该被设置为ALERT,否则就可以设置为SAFT。这则攻略将演示如何编写一个可以收集网络远程主机详细信息的监视脚本。

8.12.1 新手上路

我们需要分别从网络中每台主机收集磁盘使用情况的统计信息,并写入中央主机的日志文件中。可以将负责收集信息并写入日志的脚本调度为每天执行。SSH可用于登录远程系统收集磁盘使用数据。

8.12.2 实战演练

首先,我们得在所有网络中的远程主机上设置一个共用账户。这个账户供脚本disklog登录系统使用。我们需要为这个账户配置SSH自动登录(7.7节讲解了自动登录的配置方法)。我们假设在所有配置了自动登录的远程主机上都有一个叫做test的用户,那么来看看这个shell脚本:

  1. #!/bin/bash
  2. #文件名: disklog.sh
  3. #用途: 监视远程系统的磁盘使用情况
  4. logfile="diskusage.log"
  5. if [[ -n $1 ]]
  6. then
  7. logfile=$1
  8. fi
  9. if [ ! -e $logfile ]
  10. then
  11. printf "%-8s %-14s %-9s %-8s %-6s %-6s %-6s %s\n" "Date" "IP
  12. address" "Device" "Capacity" "Used" "Free" "Percent" "Status" >
  13. $logfile
  14. fi
  15. IP_LIST="127.0.0.1 0.0.0.0"
  16. #提供远程主机IP地址列表
  17. (
  18. for ip in $IP_LIST;
  19. do
  20. ssh slynux@$ip 'df -H' | grep ^/dev/ > /tmp/$$.df
  21. while read line;
  22. do
  23. cur_date=$(date +%D)
  24. printf "%-8s %-14s " $cur_date $ip
  25. echo $line | awk '{ printf("%-9s %-8s %-6s %-6s
  26. %-8s",$1,$2,$3,$4,$5); }'
  27. pusg=$(echo $line | egrep -o "[0-9]+%")
  28. pusg=${pusg/\%/};
  29. if [ $pusg -lt 80 ];
  30. then
  31. echo SAFE
  32. else
  33. echo ALERT
  34. fi
  35. done< /tmp/$$.df
  36. done
  37. ) >> $logfile

我们可以用cron以固定的间隔来调度脚本执行,例如在crontab中写入以下条目,以便实现每天上午10点运行脚本:

  1. 00 10 * * * /home/path/disklog.sh /home/user/diskusg.log

执行命令crontab -e。添加上面一行并保存。

可以手动执行脚本:

  1. $ ./disklog.sh

脚本的输出样例如下:

8.12 监视远程磁盘的健康情况 - 图1

8.12.3 工作原理

在脚本disklog.sh中,我们可以提供日志文件路径作为命令行参数,否则脚本使用默认的日志文件。如果日志文件不存在,它会将日志文件头部写入新文件中。-e logfile用来检查文件是否存在。远程主机的IP地址列表被存储在变量IP_LIST中,彼此之间以空格分隔。要确保在IP_LIST中列出的所有远程系统中都有用户test,并且SSH已经配置了自动登录。for循环用来对IP地址进行逐个迭代。通过ssh使用远程命令df -H获取磁盘剩余空间。这项数据被存储在一个临时文件中,while循环用来逐个读取这个文件。用awk提取并打印数据,同时一并打印的还有日期。用egrep提取使用率,并将%删除以获取使用率的数值部分。检查得到的数值,看是否超过了80。如果不足80,将状态设置为SAFT;如果大于或等于80,则将状态设置为ALERT。打印出来的所有数据要被重定向到日志文件中。因此代码被放入子shell()中,并将标准输出重定向到日志文件。

8.12.4 参考

9.8节讲解了crontab命令。