综合服务器巡检脚本:一键洞察系统健康
提升服务器运维效率,尽在我们的综合巡检脚本!专为CentOS系统设计,集成硬件信息、Java进程监控、系统资源、安全检查等功能,一键生成详尽的HTML报告(最大宽度1920px)。从CPU、内存、磁盘使用率到网络状态、开放端口,再到系统日志与安全配置,全面覆盖,清晰呈现。脚本自动检测Java进程运行状态,识别异常并提供详细诊断信息,确保系统稳定运行。输出路径灵活(/home/fuwuqixunjian/0bak),支持错误日志记录,运维更省心。立即使用,轻松掌握服务器健康状况!
使用方法:
chmod +x integrated_server_inspection.sh && sudo ./integrated_server_inspection.sh
定时任务设置:
为实现自动巡检,可通过crontab设置定时任务。例如,每天凌晨2点运行:
执行crontab -e进入编辑模式。
添加以下行:
0 2 * * * /path/to/integrated_server_inspection.sh
保存并退出,脚本将按计划自动生成巡检报告。
生成效果如下图
#!/bin/bash
# 综合服务器巡检脚本(全HTML输出版,表格最大宽度1920px)
# 融合硬件信息、Java进程检查、系统资源、安全检查等功能
# 所有内容生成到一个 HTML 报告中
# 适配 CentOS 系统
# 使用:chmod +x integrated_server_inspection.sh && sudo ./integrated_server_inspection.sh
# 输出文件目录/home/fuwuqixunjian/0bak/
# 设置输出文件
REPORT_FILE_HTML="/home/fuwuqixunjian/0bak/$(hostname -I | cut -d' ' -f1)+$(date +%Y-%m-%d_%H%M%S).html"
ERROR_LOG="inspection_errors_$(date +%Y%m%d_%H%M%S).log"
HOSTNAME=$(hostname)
CURRENT_IP=$(hostname -I | cut -d' ' -f1)
CURRENT_DATE=$(date +"%Y-%m-%d %H:%M:%S")
# 函数:检查命令是否存在
check_command() {
if ! command -v "$1" &> /dev/null; then
echo "警告:命令 '$1' 未安装或不可用。请安装相关包(如 util-linux 或 e2fsprogs)。" >> $ERROR_LOG
echo "[$CURRENT_DATE] 命令 '$1' 缺失" >> $ERROR_LOG
return 1
fi
return 0
}
# 收集数据
release=$(cat /etc/centos-release 2>/dev/null || echo "未知")
total_memory=$(free -h | awk '/^Mem:/{print $2}' 2>/dev/null || echo "未知")
memory_usage=$(free | awk '/^Mem:/{printf "%.2f", ($3/$2)*100}' 2>/dev/null || echo "未知")
cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *([0-9.]*)%* id.*/1/" | awk '{print 100 - $1}' 2>/dev/null || echo "未知")
cpu_count=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || echo "未知")
cpu_model=$(cat /proc/cpuinfo | grep "model name" | uniq | awk -F: '{print $2}' 2>/dev/null || echo "未知")
disk_total=$(df -h | awk '$NF=="/"{print $2}' 2>/dev/null || echo "未知")
disk_available=$(df -h | awk '$NF=="/"{print $4}' 2>/dev/null || echo "未知")
disk_used=$(df -h | awk '$NF=="/"{print $3}' 2>/dev/null || echo "未知")
system_uptime=$(uptime | awk '{print $3,$4}' | sed 's/,//' 2>/dev/null || echo "未知")
kernel_params=$(sysctl -a | grep -E 'kernel.version|kernel.ostype|vm.swappiness|net.ipv4.ip_forward' 2>/dev/null || echo "未知")
memory_hardware=$(sudo dmidecode --type memory | grep -E 'Size|Type|Speed' 2>/dev/null || echo "dmidecode 命令缺失或权限不足")
lsblk_info=$(lsblk -o NAME,SIZE,TYPE,MODEL 2>/dev/null || echo "lsblk 命令缺失")
vmstat_info=$(vmstat -s -S M 2>/dev/null || echo "vmstat 命令缺失")
swapon_info=$(swapon --show 2>/dev/null || echo "swapon 命令缺失")
df_info=$(df -hT 2>/dev/null || echo "df 命令缺失")
df_inode=$(df -i 2>/dev/null || echo "df 命令缺失")
ip_addr=$(ip addr show 2>/dev/null || echo "ip 命令缺失")
ip_route=$(ip route show 2>/dev/null || echo "ip 命令缺失")
net_stats=$(if command -v ss &>/dev/null; then ss -s; elif command -v netstat &>/dev/null; then netstat -s; else echo "ss 或 netstat 缺失"; fi)
open_ports=$(if command -v ss &>/dev/null; then ss -tuln; elif command -v netstat &>/dev/null; then netstat -tuln; else echo "ss 或 netstat 缺失"; fi)
dns_config=$(cat /etc/resolv.conf 2>/dev/null || echo "文件不可访问")
process_count=$(ps aux | wc -l 2>/dev/null || echo "ps 命令缺失")
high_cpu=$(ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head -n 11 2>/dev/null || echo "ps 命令缺失")
high_mem=$(ps -eo pid,ppid,cmd,%mem --sort=-%mem | head -n 11 2>/dev/null || echo "ps 命令缺失")
services=$(if command -v systemctl &>/dev/null; then systemctl list-units --type=service --state=running | head -n 20; else service --status-all | grep '+' 2>/dev/null || echo "systemctl 或 service 缺失"; fi)
failed_services=$(if command -v systemctl &>/dev/null; then systemctl --failed; else echo "systemctl 缺失"; fi)
firewall_status=$(if command -v firewall-cmd &>/dev/null; then sudo firewall-cmd --list-all; elif command -v iptables &>/dev/null; then sudo iptables -L -n -v; else echo "firewalld 或 iptables 缺失"; fi)
selinux_status=$(sestatus 2>/dev/null || echo "sestatus 命令缺失")
login_history=$(last -n 10 2>/dev/null || echo "last 命令缺失")
current_users=$(who 2>/dev/null || echo "who 命令缺失")
sudoers_summary=$(grep -v '^#' /etc/sudoers 2>/dev/null | grep -v '^$' || echo "文件不可访问")
package_updates=$(if command -v yum &>/dev/null; then sudo yum check-update; elif command -v dnf &>/dev/null; then sudo dnf check-update; else echo "yum 或 dnf 缺失"; fi)
sys_logs=$(journalctl -n 20 --no-pager 2>/dev/null || tail -n 20 /var/log/messages 2>/dev/null || echo "日志不可访问")
error_logs=$(journalctl -p err -n 10 --no-pager 2>/dev/null || grep -iE "error|fail|crit" /var/log/messages | tail -n 10 2>/dev/null || echo "日志不可访问")
dmesg_info=$(dmesg | tail -n 20 2>/dev/null || echo "dmesg 命令缺失")
kernel_modules=$(lsmod | head -n 20 2>/dev/null || echo "lsmod 命令缺失")
cron_tasks=$(crontab -l 2>/dev/null || echo "无用户 cron 任务")
env_vars=$(env | grep -E 'PATH|HOME|USER|SHELL' 2>/dev/null || echo "env 命令缺失")
# Java 进程
java_pids=$(pgrep -f "java" 2>/dev/null)
java_table=""
status_summary="正常,无异常。"
if [[ -n "$java_pids" ]]; then
for pid in $java_pids; do
java_memory_usage=$(ps -p $pid -o %mem | tail -n +2 2>/dev/null || echo "未知")
java_cpu_usage=$(ps -p $pid -o %cpu | tail -n +2 2>/dev/null || echo "未知")
java_runtime=$(ps -p $pid -o etime | tail -n +2 2>/dev/null || echo "未知")
java_disk_usage=$(ps -p $pid -o cmd= | awk -F '-Dcatalina.base=' '{print $2}' | awk '{print $1}' | xargs du -sh 2>/dev/null | awk '{print $1}' || echo "未知")
java_program_location=$(ps -p $pid -o cmd= | awk -F '-Dcatalina.base=' '{print $2}' | awk '{print $1}' 2>/dev/null || echo "未知")
java_port=$(netstat -tlnp 2>/dev/null | grep "$pid/java" | awk '{print $4}' | awk -F: '{print $NF}' || ss -tlnp 2>/dev/null | grep "$pid/java" | awk '{print $5}' | awk -F: '{print $NF}' || echo "未知")
status="正常"
if [[ -z "$java_port" || "${java_cpu_usage%.*}" -gt 90 || "${java_memory_usage%.*}" -gt 90 ]]; then
status="异常"
status_summary="异常,请检查 Java 进程。"
fi
# 转义 HTML 特殊字符
java_program_location=$(echo "$java_program_location" | sed 's/&/&/g; s/</</g; s/>/>/g')
java_table+="<tr><td>$pid</td><td>$java_memory_usage%</td><td>$java_cpu_usage%</td><td>$java_runtime</td><td>$java_disk_usage</td><td>$java_program_location</td><td>$java_port</td><td>$status</td></tr>"
done
else
java_table="<tr><td colspan='8'>当前系统中没有 Java 进程在运行。</td></tr>"
fi
# 构建 HTML 内容
html_content=$(cat <<EOF
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>巡检记录 $CURRENT_DATE</title>
<style>
body { font-family: Arial, sans-serif; }
table { max-width: 1920px; width: 100%; border-collapse: collapse; margin-bottom: 20px; margin-left: auto; margin-right: auto; }
th, td { border: 1px solid #000; padding: 8px; text-align: center; }
h1, h2, h3 { color: #333; }
pre { background: #f4f4f4; padding: 10px; overflow: auto; }
</style>
</head>
<body>
<h1>巡检记录 $CURRENT_DATE</h1>
<h3>主机名: $HOSTNAME <br>IP: $CURRENT_IP <br>系统运行时间: $system_uptime</h3>
<h2>1. 系统基本信息</h2>
<table>
<tr><th>检查项</th><th>结果</th></tr>
<tr><td>操作系统版本</td><td>$release</td></tr>
<tr><td>内核版本和参数</td><td><pre>$kernel_params</pre></td></tr>
<tr><td>系统运行时间和负载</td><td>$system_uptime</td></tr>
</table>
<h2>2. 硬件信息</h2>
<table>
<tr><th>检查项</th><th>结果</th></tr>
<tr><td>系统总内存</td><td>$total_memory</td></tr>
<tr><td>内存使用率</td><td>${memory_usage}%</td></tr>
<tr><td>内存硬件详情</td><td><pre>$memory_hardware</pre></td></tr>
<tr><td>磁盘硬件详情</td><td><pre>$lsblk_info</pre></td></tr>
<tr><td>磁盘总量</td><td>$disk_total</td></tr>
<tr><td>磁盘可使用空间</td><td>$disk_available</td></tr>
<tr><td>磁盘已使用空间</td><td>$disk_used</td></tr>
</table>
<h2>3. CPU 使用情况</h2>
<table>
<tr><th>检查项</th><th>结果</th></tr>
<tr><td>CPU 使用率</td><td>${cpu_usage}%</td></tr>
<tr><td>CPU 个数</td><td>$cpu_count</td></tr>
<tr><td>CPU 型号</td><td>$cpu_model</td></tr>
</table>
<h2>4. 内存使用情况</h2>
<table>
<tr><th>检查项</th><th>结果</th></tr>
<tr><td>内存详细信息</td><td><pre>$vmstat_info</pre></td></tr>
<tr><td>Swap 使用情况</td><td><pre>$swapon_info</pre></td></tr>
</table>
<h2>5. 磁盘和文件系统</h2>
<table>
<tr><th>检查项</th><th>结果</th></tr>
<tr><td>磁盘空间使用</td><td><pre>$df_info</pre></td></tr>
<tr><td>Inode 使用情况</td><td><pre>$df_inode</pre></td></tr>
</table>
<h2>6. 网络状态</h2>
<table>
<tr><th>检查项</th><th>结果</th></tr>
<tr><td>网络接口配置</td><td><pre>$ip_addr</pre></td></tr>
<tr><td>路由信息</td><td><pre>$ip_route</pre></td></tr>
<tr><td>网络连接统计</td><td><pre>$net_stats</pre></td></tr>
<tr><td>开放端口</td><td><pre>$open_ports</pre></td></tr>
<tr><td>DNS 配置</td><td><pre>$dns_config</pre></td></tr>
</table>
<h2>7. 进程和服务</h2>
<table>
<tr><th>检查项</th><th>结果</th></tr>
<tr><td>运行进程总数</td><td>$process_count</td></tr>
<tr><td>前 10 个高 CPU 占用进程</td><td><pre>$high_cpu</pre></td></tr>
<tr><td>前 10 个高内存占用进程</td><td><pre>$high_mem</pre></td></tr>
<tr><td>系统服务状态</td><td><pre>$services</pre></td></tr>
<tr><td>失败服务</td><td><pre>$failed_services</pre></td></tr>
</table>
<h2>8. 系统 (Java 进程)</h2>
<table>
<thead>
<tr>
<th>Java进程PID</th>
<th>内存使用率</th>
<th>CPU使用率</th>
<th>进程运行时长</th>
<th>进程使用磁盘空间</th>
<th>进程目录地址</th>
<th>端口号</th>
<th>系统是否正常</th>
</tr>
</thead>
<tbody>
$java_table
</tbody>
</table>
<h2>9. 安全检查</h2>
<table>
<tr><th>检查项</th><th>结果</th></tr>
<tr><td>防火墙状态</td><td><pre>$firewall_status</pre></td></tr>
<tr><td>SELinux 状态</td><td><pre>$selinux_status</pre></td></tr>
<tr><td>用户登录历史(最近 10 次)</td><td><pre>$login_history</pre></td></tr>
<tr><td>当前登录用户</td><td><pre>$current_users</pre></td></tr>
<tr><td>sudoers 文件摘要</td><td><pre>$sudoers_summary</pre></td></tr>
<tr><td>包更新检查</td><td><pre>$package_updates</pre></td></tr>
</table>
<h2>10. 系统日志和错误</h2>
<table>
<tr><th>检查项</th><th>结果</th></tr>
<tr><td>最近 20 条系统日志</td><td><pre>$sys_logs</pre></td></tr>
<tr><td>最近 10 条错误日志</td><td><pre>$error_logs</pre></td></tr>
<tr><td>内核日志(dmesg 摘要)</td><td><pre>$dmesg_info</pre></td></tr>
</table>
<h2>11. 其他高级检查</h2>
<table>
<tr><th>检查项</th><th>结果</th></tr>
<tr><td>加载的内核模块</td><td><pre>$kernel_modules</pre></td></tr>
<tr><td>cron 任务摘要</td><td><pre>$cron_tasks</pre></td></tr>
<tr><td>环境变量</td><td><pre>$env_vars</pre></td></tr>
</table>
<h2>总结结果</h2>
<h3>系统 $status_summary。</h3>
<h4>巡检完成时间: $(date '+%Y-%m-%d %H:%M:%S')</h4>
</body>
</html>
EOF
)
# 写入 HTML 文件
mkdir -p /home/fuwuqixunjian/0bak 2>/dev/null
echo "$html_content" > "$REPORT_FILE_HTML"
# 输出提示
echo "综合巡检完成,HTML 报告已生成:$REPORT_FILE_HTML"
if [ -s $ERROR_LOG ]; then
echo "有错误或警告,请检查:$ERROR_LOG"
else
rm -f $ERROR_LOG
fi
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...