无头Linux服务器的硬盘监视脚本
现代硬盘驱动器有一个内部机制称为S.M.A.R.T.通过它可以知道硬盘何时会发生故障。服务器在出现这种故障之前向我们发送电子邮件会很好吗?
总览
诸如mdadm(用于软件RAID管理)和Palimpsest Disk Utility(在Ubuntu LiveCD上使用)之类的程序使用S.M.A.R.T信息来通知我们磁盘何时即将发生故障或者发生故障。但是,在无鼠键显示器服务器(无GUI)上,没有任何服务可以在太迟之前通知我们即将发生的厄运。此外,如果不手动登录服务器,我们怎么知道呢?
该脚本每天与cron一起运行时,将警告系统的任何硬盘坏道计数是否已达到故意低于磁盘坏阈值的限制,并通过电子邮件将警告发送给计算机管理员。
设置
安装smartmontools软件包,该软件包从硬盘驱动器控制器中读取S.M.A.R.T信息,并提供给我们。
sudo aptitude install smartmontools
创建监视脚本:
sudo vim /root/smart-monitor.sh
使它成为内容:
#!/bin/bash ########Email function######## email_admin_func() { echo "To: [email protected]" > $temp_email_file echo "From: [email protected]" >> $temp_email_file echo "Subject: S.M.A.R.T monitor Threshold breached" >> $temp_email_file echo "" >> $temp_email_file echo -e >> $temp_email_file /usr/sbin/ssmtp -t < $temp_email_file echo "Sent an Email to the Admin" } smartc_func() { /usr/sbin/smartctl -A /dev/ | grep Reallocated_Sector_Ct |tr -s ' '|cut -d' ' -f11 } ########End of Functions######## ########Set working parameter######## temp_email_file=/tmp/smart_monitor.txt allowed_threshold=5 #set the amount of bad sectors your willing to live with, recommended 5. ########Engine######## for i in sda sdb ; do # Add or subtract disk names from this list as appropriate for your setup. if [[ "`smartc_func $i`" -ge $allowed_threshold ]] ; then echo Emailing the Administrator email_admin_func "One of the HDs on "`hostname`", has reached the upper threshold limit!!! nThe threshold was set to:$allowed_threshold and the $i disk status was: "`smartc_func $i`"" fi done
需要注意的关键点是:
电子邮件功能设置适当的信息,例如机器名称和管理员电子邮件。
允许的阈值将此参数设置为我们认为合适的值,因为使用的服务器级硬盘驱动器的限制设置为10,所以我使用了5. )。
通过调整for循环中磁盘名称的枚举来设置要监视的设备。当前包含两个磁盘(sda和sdb),因此请针对设置进行调整。如果由于某种原因需要*排除磁盘,则可以包括所有磁盘,也可以包括其中的一些磁盘。
*在我的原始设置中,第一个磁盘是闪存驱动器,因此,如果可能的话,读取它的信息没有多大用处。
使脚本可执行:
sudo chmod +x /root/smart-monitor.sh
设置完成。
安排脚本自动运行
我们要使脚本自动运行,因此我们将为其创建一个新的Cron作业。
如Linux上的如何设置电子邮件警报指南中所述,这样做的结果是,如果脚本本身遇到错误,则cron会在发生错误时立即通过电子邮件自动通知我们。
打开cron作业计划程序:
sudo crontab -e
将此添加到其内容:
0 7 * * * /root/smart-monitor.sh > /tmp/last_smart_monitor_run.log
这会将脚本设置为每天早上7点运行。