如何写主机状态监控脚本

wen 实用脚本 22

本文目录导读:

如何写主机状态监控脚本

  1. 基础系统资源监控脚本
  2. 高级监控脚本(带报警功能)
  3. 实时监控脚本(带图表输出)
  4. 使用方式
  5. 监控指标说明

我来为您提供几种常见的主机状态监控脚本,涵盖不同的监控需求:

基础系统资源监控脚本

#!/bin/bash
# 系统资源监控脚本
# 监控CPU、内存、磁盘、网络等基本信息
echo "========== 主机状态监控报告 =========="
echo "监控时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "主机名: $(hostname)"
echo "----------------------------------------"
# CPU使用率
echo "CPU使用率:"
top -bn1 | grep "Cpu(s)" | awk '{print "  用户态: "$2"%  系统态: "$4"%  空闲: "$8"%"}'
# 内存使用情况
echo -e "\n内存使用情况:"
free -h | grep -E "^Mem|^内存" | awk '{print "  总计: "$2"  已用: "$3"  可用: "$4"  使用率: "$3/$2}'
# 磁盘使用情况
echo -e "\n磁盘使用情况:"
df -h | grep -E "^/dev/" | awk '{print "  "$1": 总计"$2"  已用"$3"  可用"$4"  使用率"$5}'
# 网络连接状态
echo -e "\n网络连接状态:"
echo "  活动连接数: $(ss -t | wc -l)"
echo "  IP地址: $(ip addr show | grep 'inet ' | grep -v 127.0.0.1 | awk '{print $2}')"
# 系统负载
echo -e "\n系统负载:"
uptime | awk -F'load average:' '{print "  "$2}'
# 进程数
echo -e "\n运行进程数:"
ps aux | wc -l

高级监控脚本(带报警功能)

#!/bin/bash
# 高级主机监控脚本
# 支持阈值告警,可配置监控项
# 配置阈值
CPU_THRESHOLD=80
MEM_THRESHOLD=80
DISK_THRESHOLD=90
UPTIME_THRESHOLD=30  # 天
# 日志文件
LOG_FILE="/var/log/host_monitor.log"
# 告警函数
alert() {
    local level=$1
    local message=$2
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $message" >> $LOG_FILE
    # 可选:发送邮件或消息通知
    # mail -s "主机告警" admin@example.com <<< "$message"
}
# CPU监控
check_cpu() {
    CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'.' -f1)
    if [ "$CPU_USAGE" -gt "$CPU_THRESHOLD" ]; then
        alert "WARNING" "CPU使用率过高: ${CPU_USAGE}% (阈值: ${CPU_THRESHOLD}%)"
        return 1
    fi
    return 0
}
# 内存监控
check_memory() {
    MEM_USAGE=$(free | grep Mem | awk '{printf "%.0f", $3/$2 * 100}')
    if [ "$MEM_USAGE" -gt "$MEM_THRESHOLD" ]; then
        alert "WARNING" "内存使用率过高: ${MEM_USAGE}% (阈值: ${MEM_THRESHOLD}%)"
        return 1
    fi
    return 0
}
# 磁盘监控
check_disk() {
    df -h | grep -E "^/dev/" | while read line; do
        DISK_USAGE=$(echo $line | awk '{print $5}' | sed 's/%//')
        DISK_NAME=$(echo $line | awk '{print $1}')
        if [ "$DISK_USAGE" -gt "$DISK_THRESHOLD" ]; then
            alert "WARNING" "磁盘 ${DISK_NAME} 使用率过高: ${DISK_USAGE}% (阈值: ${DISK_THRESHOLD}%)"
        fi
    done
}
# 系统运行时间监控
check_uptime() {
    UPTIME_DAYS=$(uptime | awk '{print $3}' | cut -d',' -f1)
    if [ "$UPTIME_DAYS" -gt "$UPTIME_THRESHOLD" ]; then
        alert "INFO" "系统已运行 ${UPTIME_DAYS} 天,建议重启"
    fi
}
# 主函数
main() {
    echo "开始监控主机状态..."
    check_cpu
    check_memory
    check_disk
    check_uptime
    echo "监控完成,详细信息在 $LOG_FILE"
}
main

实时监控脚本(带图表输出)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import psutil
import time
import sys
from datetime import datetime
class HostMonitor:
    def __init__(self):
        self.cpu_history = []
        self.mem_history = []
    def get_cpu_usage(self):
        return psutil.cpu_percent(interval=1)
    def get_memory_usage(self):
        mem = psutil.virtual_memory()
        return mem.percent
    def get_disk_usage(self):
        """返回磁盘使用率超过80%的分区"""
        alerts = []
        for partition in psutil.disk_partitions():
            try:
                usage = psutil.disk_usage(partition.mountpoint)
                if usage.percent > 80:
                    alerts.append(f"{partition.device}: {usage.percent}%")
            except:
                continue
        return alerts
    def get_network_stats(self):
        net = psutil.net_io_counters()
        return {
            'bytes_sent': net.bytes_sent,
            'bytes_recv': net.bytes_recv,
            'packets_sent': net.packets_sent,
            'packets_recv': net.packets_recv
        }
    def get_process_count(self):
        return len(psutil.pids())
    def display_status(self):
        cpu = self.get_cpu_usage()
        mem = self.get_memory_usage()
        disk_alerts = self.get_disk_usage()
        processes = self.get_process_count()
        # 清屏
        print("\033[2J\033[H")
        print(f"=== 主机监控面板 - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} ===")
        # CPU使用率显示
        cpu_bar = '█' * int(cpu/10) + '░' * (10 - int(cpu/10))
        print(f"\nCPU使用率: [{cpu_bar}] {cpu:.1f}%")
        # 内存使用率显示
        mem_bar = '█' * int(mem/10) + '░' * (10 - int(mem/10))
        print(f"内存使用率: [{mem_bar}] {mem:.1f}%")
        # 磁盘告警
        if disk_alerts:
            print("\n磁盘告警:")
            for alert in disk_alerts:
                print(f"  ⚠ {alert}")
        # 进程数
        print(f"\n运行进程数: {processes}")
        # 网络统计
        net = self.get_network_stats()
        print(f"网络流量: 发送 {self.format_bytes(net['bytes_sent'])} | 接收 {self.format_bytes(net['bytes_recv'])}")
    def format_bytes(self, bytes):
        for unit in ['B', 'KB', 'MB', 'GB']:
            if bytes < 1024:
                return f"{bytes:.2f}{unit}"
            bytes /= 1024
        return f"{bytes:.2f}TB"
def main():
    # pip install psutil
    monitor = HostMonitor()
    try:
        while True:
            monitor.display_status()
            time.sleep(2)
    except KeyboardInterrupt:
        print("\n监控已停止")
if __name__ == "__main__":
    main()

使用方式

安装依赖

# Python版本需要安装psutil
pip install psutil
# 或使用pip3
pip3 install psutil

设置定时任务

# 每分钟运行一次监控
*/1 * * * * /path/to/monitor.sh
# 每5分钟运行一次
*/5 * * * * /path/to/monitor.sh

赋予执行权限

chmod +x monitor.sh
chmod +x monitor.py

监控指标说明

监控项 说明 告警阈值建议
CPU使用率 当前CPU占用百分比 >80%
内存使用率 物理内存使用率 >80%
磁盘使用率 各分区使用情况 >90%
网络连接 活动连接数 根据业务确定
系统负载 过去1/5/15分钟负载 小于CPU核数
运行时间 系统已运行天数 >30天

这些脚本可以根据您的具体需求进行修改和扩展,建议先在实际环境中测试,确认无误后再部署到生产环境。

抱歉,评论功能暂时关闭!