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