Linux系统监控脚本:实时性能监控与日志记录工具

Linux系统监控脚本:实时性能监控与日志记录工具

系统监控脚本

#!/bin/bash

# 系统监控脚本 - 每分钟记录系统状态信息

# 日志文件路径
LOG_FILE="/var/log/system_monitor.log"
# 如果没有权限写入/var/log,则使用当前目录
if [ ! -w "/var/log" ]; then
    LOG_FILE="./system_monitor.log"
fi

# 创建日志文件(如果不存在)
touch "$LOG_FILE"

# 日志记录函数
log_message() {
    echo "$1" >> "$LOG_FILE"
}

# 获取系统负载信息
get_load_info() {
    echo "=== 系统负载信息 ==="
    uptime
    echo ""
    
    # 获取CPU使用率
    echo "=== CPU使用率 ==="
    cat /proc/loadavg
    echo ""
    
    # 内存使用情况
    echo "=== 内存使用情况 ==="
    free -h
    echo ""
    
    # 磁盘使用情况
    echo "=== 磁盘使用情况 ==="
    df -h | head -10
    echo ""
}

# 获取TOP5进程信息
get_top_processes() {
    echo "=== TOP5 CPU使用进程 ==="
    ps aux --sort=-%cpu | head -6
    echo ""
    
    echo "=== TOP5 内存使用进程 ==="
    ps aux --sort=-%mem | head -6
    echo ""
    
    echo "=== TOP5进程详细信息及目录 ==="
    # 获取CPU使用率最高的5个进程的详细信息
    for pid in $(ps aux --sort=-%cpu | awk 'NR>1 && NR<=6 {print $2}'); do
        if [ -d "/proc/$pid" ]; then
            cmd=$(ps -p $pid -o comm= 2>/dev/null)
            cwd=$(readlink /proc/$pid/cwd 2>/dev/null)
            exe=$(readlink /proc/$pid/exe 2>/dev/null)
            echo "PID: $pid | 命令: $cmd | 工作目录: $cwd | 执行文件: $exe"
        fi
    done
    echo ""
}

# 获取vmstat信息
get_vmstat_info() {
    echo "=== VMSTAT 监控信息 ==="
    vmstat 1 3
    echo ""
    
    echo "=== IO统计信息 ==="
    iostat -x 1 2 2>/dev/null || echo "iostat 未安装,跳过IO统计"
    echo ""
}

# 获取网络信息
get_network_info() {
    echo "=== 网络连接统计 ==="
    netstat -i 2>/dev/null | head -10 || echo "netstat 未安装,跳过网络统计"
    echo ""
    
    echo "=== TCP连接状态统计 ==="
    netstat -ant 2>/dev/null | awk '{print $6}' | sort | uniq -c | sort -nr || echo "netstat 未安装,跳过TCP统计"
    echo ""
}

# 主监控函数
monitor_system() {
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    
    {
        echo "######################################################################"
        echo "# 系统监控报告 - $timestamp"
        echo "######################################################################"
        echo ""
        
        get_load_info
        get_top_processes
        get_vmstat_info
        get_network_info
        
        echo "######################################################################"
        echo "# 监控报告结束 - $timestamp"
        echo "######################################################################"
        echo ""
        echo ""
    } >> "$LOG_FILE"
}

# 主循环
main() {
    echo "系统监控脚本已启动..."
    echo "日志文件位置: $LOG_FILE"
    echo "按 Ctrl+C 停止监控"
    echo ""
    
    # 记录脚本启动信息
    log_message "系统监控脚本启动 - $(date '+%Y-%m-%d %H:%M:%S')"
    
    while true; do
        monitor_system
        echo "$(date '+%Y-%m-%d %H:%M:%S') - 监控数据已记录到日志"
        
        # 等待60秒(1分钟)
        sleep 60
    done
}

# 信号处理函数
cleanup() {
    echo ""
    echo "收到停止信号,正在清理..."
    log_message "系统监控脚本停止 - $(date '+%Y-%m-%d %H:%M:%S')"
    echo "监控已停止"
    exit 0
}

# 设置信号捕获
trap cleanup SIGINT SIGTERM

# 检查是否以root权限运行(推荐但不强制)
if [ "$EUID" -ne 0 ]; then
    echo "注意: 建议以root权限运行以获取完整的系统信息"
    echo "继续以当前用户权限运行..."
    echo ""
fi

# 启动主程序
main