使用 Bash 构建 Linux 系统监控工具

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本项目中,你将使用 shell 脚本创建一个 Linux 系统监控工具。该脚本将持续跟踪系统的 CPU、内存和磁盘使用情况,并实时显示使用百分比。如果任何资源的使用率超过预设阈值,将显示警报。通过完成此项目,你将学习基础的 Linux 脚本编写技能,同时构建一个实用的工具。

Linux 系统监控

🎯 任务

通过完成本项目,你将:

  • 学习如何创建 shell 脚本来监控系统资源。
  • 了解如何设置和使用 CPU、内存和磁盘使用率的阈值。
  • 创建一个函数,在超过阈值时发送警报。

🏆 成果

完成本项目后,你将:

  • 能够使用 shell 脚本创建并运行 Linux 系统监控工具。
  • 理解如何使用 topfreedf 等系统资源命令。
  • 具备扩展脚本的能力,例如添加电子邮件通知等新功能。

项目设置

首先为你的脚本准备一个干净的工作空间。我们推荐使用 WebIDE 来完成此项目,因为它非常适合编写和测试脚本。

进入该目录并创建一个名为 system_monitor.sh 的文件:

cd ~/project
touch system_monitor.sh
创建系统监控脚本

在你喜欢的文本编辑器中打开该文件,并添加以下内容:

#!/bin/bash

## 定义 CPU、内存和磁盘使用率的阈值(百分比)
CPU_THRESHOLD=80
MEMORY_THRESHOLD=80
DISK_THRESHOLD=80

以下是代码各部分的作用:

  • #!/bin/bash:此行指定脚本将使用 Bash shell 解释执行。
  • CPU_THRESHOLD=80:将 CPU 使用率阈值设置为 80%。你可以稍后调整此值。
  • MEMORY_THRESHOLD=80DISK_THRESHOLD=80:同样,这些定义了内存和磁盘使用率的阈值。

保存文件并使其可执行:

chmod +x system_monitor.sh

添加警报功能

现在,让我们添加一个函数,当资源使用率超过阈值时发送警报。打开 system_monitor.sh 并添加以下代码:

## Function to send an alert
send_alert() {
  echo "$(tput setaf 1)ALERT: $1 usage exceeded threshold! Current value: $2%$(tput sgr0)"
}

以下是该函数的解析:

  • send_alert:该函数接受两个参数:
    • $1 表示资源类型(例如 CPU、Memory、Disk)。
    • $2 表示当前使用率百分比。
  • tput setaf 1:将文本颜色更改为红色,以使警报在视觉上更加突出。
  • tput sgr0:在警报消息后重置文本格式为正常。

添加一个测试调用以验证该函数是否正常工作:

send_alert "CPU" 85
警报功能代码片段

运行脚本:

./system_monitor.sh

你应该会看到类似以下的红色警报消息:

ALERT: CPU usage exceeded threshold! Current value: 85%

在继续之前,请从脚本中删除 send_alert 的测试调用。

监控 CPU 使用率

让我们添加逻辑来监控 CPU 使用率。打开脚本并添加以下代码:

## Monitor CPU usage
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
cpu_usage=${cpu_usage%.*} ## Convert to integer
echo "Current CPU usage: $cpu_usage%"

if ((cpu_usage >= CPU_THRESHOLD)); then
  send_alert "CPU" "$cpu_usage"
fi

以下是这段代码的作用:

  1. top -bn1:以批处理模式运行 top 命令,进行一次迭代以获取实时 CPU 统计数据。
  2. grep "Cpu(s)":过滤输出以专注于 CPU 使用率行。
  3. awk '{print $2 + $4}':提取并求和用户和系统 CPU 使用率的百分比。
  4. cpu_usage=${cpu_usage%.*}:去除小数部分以简化阈值比较。
  5. if ((cpu_usage >= CPU_THRESHOLD)):将 CPU 使用率与阈值进行比较,如果超过阈值则调用 send_alert

运行脚本以测试 CPU 监控:

./system_monitor.sh

你应该会看到显示的 CPU 使用率。如果超过阈值,你将看到警报。

监控内存使用率

接下来,添加代码以监控内存使用率。在 CPU 监控逻辑下方插入以下代码:

## Monitor memory usage
memory_usage=$(free | awk '/Mem/ {printf("%3.1f", ($3/$2) * 100)}')
echo "Current memory usage: $memory_usage%"
memory_usage=${memory_usage%.*}
if ((memory_usage >= MEMORY_THRESHOLD)); then
  send_alert "Memory" "$memory_usage"
fi

以下是其工作原理:

  1. free:提供内存使用统计数据。
  2. awk '/Mem/ {printf("%3.1f", ($3/$2) * 100)}':通过将已用内存($3)除以总内存($2)来计算内存使用百分比。
  3. 脚本将 memory_usage 与阈值进行比较,并在必要时发送警报。

运行脚本:

./system_monitor.sh

你应该会看到内存使用率百分比,如果使用率超过阈值,将触发警报。

监控磁盘使用率

现在,让我们监控磁盘使用率。在内存监控逻辑下方添加以下代码:

## Monitor disk usage
disk_usage=$(df -h / | awk '/\// {print $(NF-1)}')
disk_usage=${disk_usage%?} ## 移除百分号
echo "Current disk usage: $disk_usage%"

if ((disk_usage >= DISK_THRESHOLD)); then
  send_alert "Disk" "$disk_usage"
fi

解释:

  1. df -h /:获取根目录的磁盘使用统计数据。
  2. awk '/\// {print $(NF-1)}':提取使用率百分比列。
  3. disk_usage=${disk_usage%?}:移除 % 符号以便于比较。
  4. 如果磁盘使用率超过阈值,将触发警报。

运行脚本:

./system_monitor.sh

你应该会看到磁盘使用率统计数据,并在必要时触发警报。

将所有功能整合到循环中

最后,将 CPU、内存和磁盘监控整合到一个循环中,以实现持续监控。将现有内容替换为以下代码:

while true; do
  ## Monitor CPU
  cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
  cpu_usage=${cpu_usage%.*}
  if ((cpu_usage >= CPU_THRESHOLD)); then
    send_alert "CPU" "$cpu_usage"
  fi

  ## Monitor memory
  memory_usage=$(free | awk '/Mem/ {printf("%3.1f", ($3/$2) * 100)}')
  memory_usage=${memory_usage%.*}
  if ((memory_usage >= MEMORY_THRESHOLD)); then
    send_alert "Memory" "$memory_usage"
  fi

  ## Monitor disk
  disk_usage=$(df -h / | awk '/\// {print $(NF-1)}')
  disk_usage=${disk_usage%?}
  if ((disk_usage >= DISK_THRESHOLD)); then
    send_alert "Disk" "$disk_usage"
  fi

  ## Display current stats
  clear
  echo "Resource Usage:"
  echo "CPU: $cpu_usage%"
  echo "Memory: $memory_usage%"
  echo "Disk: $disk_usage%"
  sleep 2
done

此循环持续监控并更新资源使用情况,定期清屏并显示当前统计数据。

运行脚本以测试:

./system_monitor.sh

总结

恭喜!你已经使用 Bash 构建了一个功能齐全的 Linux 系统监控工具。该工具实时跟踪 CPU、内存和磁盘使用情况,并在使用率超过预设阈值时发出警报。你可以通过添加电子邮件通知或监控其他资源等功能来扩展脚本。

Linux 系统监控