云计算百科
云计算领域专业知识百科平台

运维面试必备:Shell脚本 监控服务器磁盘使用率并发送告警邮件

Shell面试题 – 编写一个Shell脚本,检查服务器的磁盘使用率,并发送告警邮件。


概述

在服务器运维工作中,磁盘空间监控是一项基础但至关重要的任务。本文将介绍如何编写一个Shell脚本来自动检查服务器的磁盘使用率,并在超过阈值时发送告警邮件。

流程图

以下是整个脚本执行流程的图示:

#mermaid-svg-dJ6UFPkIsS4i67N8 {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-dJ6UFPkIsS4i67N8 .error-icon{fill:#552222;}#mermaid-svg-dJ6UFPkIsS4i67N8 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dJ6UFPkIsS4i67N8 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-dJ6UFPkIsS4i67N8 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dJ6UFPkIsS4i67N8 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dJ6UFPkIsS4i67N8 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dJ6UFPkIsS4i67N8 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dJ6UFPkIsS4i67N8 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dJ6UFPkIsS4i67N8 .marker.cross{stroke:#333333;}#mermaid-svg-dJ6UFPkIsS4i67N8 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dJ6UFPkIsS4i67N8 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-dJ6UFPkIsS4i67N8 .cluster-label text{fill:#333;}#mermaid-svg-dJ6UFPkIsS4i67N8 .cluster-label span{color:#333;}#mermaid-svg-dJ6UFPkIsS4i67N8 .label text,#mermaid-svg-dJ6UFPkIsS4i67N8 span{fill:#333;color:#333;}#mermaid-svg-dJ6UFPkIsS4i67N8 .node rect,#mermaid-svg-dJ6UFPkIsS4i67N8 .node circle,#mermaid-svg-dJ6UFPkIsS4i67N8 .node ellipse,#mermaid-svg-dJ6UFPkIsS4i67N8 .node polygon,#mermaid-svg-dJ6UFPkIsS4i67N8 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-dJ6UFPkIsS4i67N8 .node .label{text-align:center;}#mermaid-svg-dJ6UFPkIsS4i67N8 .node.clickable{cursor:pointer;}#mermaid-svg-dJ6UFPkIsS4i67N8 .arrowheadPath{fill:#333333;}#mermaid-svg-dJ6UFPkIsS4i67N8 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-dJ6UFPkIsS4i67N8 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-dJ6UFPkIsS4i67N8 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-dJ6UFPkIsS4i67N8 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-dJ6UFPkIsS4i67N8 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-dJ6UFPkIsS4i67N8 .cluster text{fill:#333;}#mermaid-svg-dJ6UFPkIsS4i67N8 .cluster span{color:#333;}#mermaid-svg-dJ6UFPkIsS4i67N8 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-dJ6UFPkIsS4i67N8 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}开始获取磁盘使用率使用率>阈值?发送告警邮件结束

脚本实现

1. 获取磁盘使用率

首先,我们需要获取磁盘的使用情况。在Linux中,可以使用df命令来实现:

#!/bin/bash

# 设置阈值(百分比)
THRESHOLD=90

# 获取根分区使用率
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | cut -d'%' -f1)

2. 检查是否超过阈值

if [ "$DISK_USAGE" -gt "$THRESHOLD" ]; then
echo "警告:磁盘使用率超过阈值!当前使用率: ${DISK_USAGE}%"
# 这里可以添加发送邮件的代码
else
echo "磁盘使用正常。当前使用率: ${DISK_USAGE}%"
fi

3. 发送告警邮件

我们可以使用mailx命令来发送邮件。首先确保系统已安装mailx:

# 对于基于Debian的系统
sudo apt-get install mailutils

# 对于基于RHEL的系统
sudo yum install mailx

然后添加发送邮件的代码:

if [ "$DISK_USAGE" -gt "$THRESHOLD" ]; then
SUBJECT="磁盘空间告警 – 服务器 $(hostname)"
BODY="警告:磁盘使用率已达到 ${DISK_USAGE}%,超过了设定的阈值 ${THRESHOLD}%。请及时处理!"
echo "$BODY" | mailx -s "$SUBJECT" admin@example.com
fi

完整脚本

#!/bin/bash

# 设置阈值(百分比)
THRESHOLD=90

# 收件人邮箱
RECIPIENT="admin@example.com"

# 获取根分区使用率
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | cut -d'%' -f1)

if [ "$DISK_USAGE" -gt "$THRESHOLD" ]; then
SUBJECT="磁盘空间告警 – 服务器 $(hostname)"
BODY="警告:磁盘使用率已达到 ${DISK_USAGE}%,超过了设定的阈值 ${THRESHOLD}%。请及时处理!"
echo "$BODY" | mailx -s "$SUBJECT" "$RECIPIENT"
echo "$(date): 发送磁盘空间告警邮件。使用率: ${DISK_USAGE}%" >> /var/log/disk_monitor.log
else
echo "$(date): 磁盘使用正常。使用率: ${DISK_USAGE}%" >> /var/log/disk_monitor.log
fi

Java实现示例

虽然Shell脚本更适合此类任务,但以下是使用Java实现的等效功能:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.mail.*;
import javax.mail.internet.*;

public class DiskMonitor {
private static final int THRESHOLD = 90;
private static final String RECIPIENT = "admin@example.com";

public static void main(String[] args) {
try {
// 获取磁盘使用率
Process process = Runtime.getRuntime().exec("df -h /");
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));

// 跳过第一行标题
reader.readLine();
String line = reader.readLine();
String[] parts = line.split("\\\\s+");
String usageStr = parts[4].replace("%", "");
int usage = Integer.parseInt(usageStr);

if (usage > THRESHOLD) {
sendAlertEmail(usage);
System.out.println("警告邮件已发送。当前使用率: " + usage + "%");
} else {
System.out.println("磁盘使用正常。当前使用率: " + usage + "%");
}
} catch (Exception e) {
e.printStackTrace();
}
}

private static void sendAlertEmail(int usage) throws MessagingException {
// 这里需要配置邮件服务器信息
String host = "smtp.example.com";
String from = "monitor@example.com";

java.util.Properties props = System.getProperties();
props.put("mail.smtp.host", host);

Session session = Session.getDefaultInstance(props, null);
Message msg = new MimeMessage(session);

msg.setFrom(new InternetAddress(from));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(RECIPIENT));
msg.setSubject("磁盘空间告警 – 使用率: " + usage + "%");
msg.setText("警告:磁盘使用率已达到 " + usage + "%,超过了设定的阈值 " + THRESHOLD + "%。请及时处理!");

Transport.send(msg);
}
}

设置定时任务

为了使脚本定期执行,可以将其添加到crontab中:

# 编辑当前用户的crontab
crontab -e

# 添加以下行,表示每小时检查一次
0 * * * * /path/to/your/script/disk_monitor.sh

进阶改进

  • 监控多个分区:

    # 监控多个分区
    PARTITIONS="/ /home /var"
    for part in $PARTITIONS; do
    USAGE=$(df -h $part | awk 'NR==2 {print $5}' | cut -d'%' -f1)
    if [ "$USAGE" -gt "$THRESHOLD" ]; then
    # 发送告警
    fi
    done

  • 添加HTML格式邮件:

    BODY="<html><body><h2>磁盘空间告警</h2><p>分区 $part 使用率已达到 ${USAGE}%</p></body></html>"
    echo "$BODY" | mailx -a "Content-type: text/html;" -s "$SUBJECT" "$RECIPIENT"

  • 添加附件:

    # 将磁盘使用情况保存为附件
    df -h > /tmp/disk_usage.txt
    echo "$BODY" | mailx -s "$SUBJECT" -a /tmp/disk_usage.txt "$RECIPIENT"

  • 总结

    通过这个简单的Shell脚本,我们可以有效地监控服务器的磁盘使用情况,并在出现问题时及时通知管理员。这种自动化监控可以大大减少因磁盘空间不足导致的服务中断风险。

    #mermaid-svg-RtHDBJK72bRaJydT {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-RtHDBJK72bRaJydT .error-icon{fill:#552222;}#mermaid-svg-RtHDBJK72bRaJydT .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-RtHDBJK72bRaJydT .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-RtHDBJK72bRaJydT .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-RtHDBJK72bRaJydT .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-RtHDBJK72bRaJydT .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-RtHDBJK72bRaJydT .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-RtHDBJK72bRaJydT .marker{fill:#333333;stroke:#333333;}#mermaid-svg-RtHDBJK72bRaJydT .marker.cross{stroke:#333333;}#mermaid-svg-RtHDBJK72bRaJydT svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-RtHDBJK72bRaJydT .pieCircle{stroke:black;stroke-width:2px;opacity:0.7;}#mermaid-svg-RtHDBJK72bRaJydT .pieTitleText{text-anchor:middle;font-size:25px;fill:black;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-RtHDBJK72bRaJydT .slice{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;fill:#333;font-size:17px;}#mermaid-svg-RtHDBJK72bRaJydT .legend text{fill:black;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:17px;}#mermaid-svg-RtHDBJK72bRaJydT :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}75%25%磁盘使用情况已使用空间可用空间

    已使用空间 : 75%可用空间 : 25%
    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 运维面试必备:Shell脚本 监控服务器磁盘使用率并发送告警邮件
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!