Linux系统诊断包脚本
基础诊断收集脚本
#!/bin/bash
# collect_diag.sh - 系统诊断信息收集
# 设置输出目录
OUTPUT_DIR="/tmp/diag_$(hostname)_$(date +%Y%m%d_%H%M%S)"
mkdir -p $OUTPUT_DIR
echo "开始收集诊断信息..."
# 系统基本信息
{
echo "=== 主机名 ==="
hostname
echo "=== 系统信息 ==="
uname -a
echo "=== 发行版 ==="
cat /etc/os-release 2>/dev/null || cat /etc/redhat-release 2>/dev/null
echo "=== 运行时间 ==="
uptime
} > $OUTPUT_DIR/system_info.txt
# CPU和内存信息
{
echo "=== CPU信息 ==="
lscpu
echo "=== 内存信息 ==="
free -h
echo "=== 内存详细 ==="
cat /proc/meminfo
} > $OUTPUT_DIR/cpu_memory.txt
# 磁盘信息
{
echo "=== 磁盘使用 ==="
df -h
echo "=== 磁盘分区 ==="
lsblk
echo "=== 挂载信息 ==="
mount
} > $OUTPUT_DIR/disk_info.txt
# 网络信息
{
echo "=== 网络接口 ==="
ip addr
echo "=== 路由表 ==="
route -n
echo "=== DNS配置 ==="
cat /etc/resolv.conf
echo "=== 网络连接 ==="
netstat -tulpn 2>/dev/null || ss -tulpn
} > $OUTPUT_DIR/network_info.txt
# 进程信息
{
echo "=== 进程列表 ==="
ps aux --sort=-%mem | head -20
echo "=== 服务状态 ==="
systemctl list-units --state=failed
systemctl list-units --type=service --state=running
} > $OUTPUT_DIR/process_info.txt
# 日志信息
{
echo "=== 系统日志(最近100行) ==="
tail -100 /var/log/messages 2>/dev/null || tail -100 /var/log/syslog
echo "=== 内核日志(最近50行) ==="
dmesg | tail -50
} > $OUTPUT_DIR/logs.txt
# 打包
tar -czf /tmp/diag_$(hostname)_$(date +%Y%m%d_%H%M%S).tar.gz $OUTPUT_DIR
echo "诊断包已生成: /tmp/diag_$(hostname)_$(date +%Y%m%d_%H%M%S).tar.gz"
Docker容器诊断脚本
#!/bin/bash
# docker_diag.sh - Docker容器诊断
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
OUTPUT_FILE="/tmp/docker_diag_${TIMESTAMP}.tar"
# 收集Docker信息
{
echo "=== Docker版本 ==="
docker version
echo "=== Docker信息 ==="
docker info
} > /tmp/docker_info.txt
# 收集容器状态
{
echo "=== 运行中的容器 ==="
docker ps
echo "=== 所有容器 ==="
docker ps -a
} > /tmp/docker_containers.txt
# 收集镜像信息
docker images > /tmp/docker_images.txt
# 收集资源使用
docker stats --no-stream > /tmp/docker_stats.txt
# 具体应用日志(可自定义)
docker logs webapp --tail 100 > /tmp/webapp_logs.txt 2>&1
# 打包
tar -cf $OUTPUT_FILE /tmp/docker_info.txt /tmp/docker_containers.txt \
/tmp/docker_images.txt /tmp/docker_stats.txt /tmp/webapp_logs.txt
gzip $OUTPUT_FILE
echo "Docker诊断包: ${OUTPUT_FILE}.gz"
网络诊断脚本
#!/bin/bash
# network_diag.sh - 网络诊断工具集
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
DIAG_DIR="/tmp/network_diag_${TIMESTAMP}"
mkdir -p $DIAG_DIR
# 基础网络测试
echo "测试网络连通性..."
ping -c 4 google.com > $DIAG_DIR/ping_google.txt 2>&1
ping -c 4 baidu.com > $DIAG_DIR/ping_baidu.txt 2>&1
# DNS测试
echo "测试DNS解析..."
nslookup google.com > $DIAG_DIR/dns_google.txt 2>&1
dig google.com > $DIAG_DIR/dig_google.txt 2>&1
# 路由追踪
echo "路由追踪..."
traceroute google.com > $DIAG_DIR/traceroute_google.txt 2>&1
# 端口检测
echo "端口扫描..."
nc -zv localhost 80 2>&1 || echo "端口80未开放" > $DIAG_DIR/port_80.txt
nc -zv localhost 443 2>&1 || echo "端口443未开放" > $DIAG_DIR/port_443.txt
# 带宽测试(需要安装speedtest-cli)
# speedtest-cli --simple > $DIAG_DIR/speedtest.txt 2>&1
# 打包
tar -czf /tmp/network_diag_${TIMESTAMP}.tar.gz $DIAG_DIR
echo "网络诊断包: /tmp/network_diag_${TIMESTAMP}.tar.gz"
Java应用诊断脚本
#!/bin/bash
# java_diag.sh - Java应用诊断
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
APP_PID=$(pgrep -f "java.*your-app-name")
if [ -z "$APP_PID" ]; then
echo "未找到Java进程"
exit 1
fi
# 获取线程dump
jstack $APP_PID > /tmp/thread_dump_${TIMESTAMP}.txt
# 获取堆dump(注意:会暂停应用)
# jmap -dump:live,format=b,file=/tmp/heap_dump_${TIMESTAMP}.hprof $APP_PID
# 获取GC日志
jstat -gcutil $APP_PID 1000 10 > /tmp/gc_stats_${TIMESTAMP}.txt
# 获取JVM参数
jinfo -flags $APP_PID > /tmp/jvm_flags_${TIMESTAMP}.txt
# 内存映射
jmap -heap $APP_PID > /tmp/heap_info_${TIMESTAMP}.txt
echo "Java诊断文件已生成:"
echo " - 线程dump: /tmp/thread_dump_${TIMESTAMP}.txt"
echo " - GC统计: /tmp/gc_stats_${TIMESTAMP}.txt"
echo " - JVM参数: /tmp/jvm_flags_${TIMESTAMP}.txt"
使用示例和自动化
一键收集所有诊断
#!/bin/bash # collect_all.sh - 一键收集所有诊断 echo "开始收集系统诊断..." bash collect_diag.sh echo "开始收集Docker诊断..." bash docker_diag.sh echo "开始收集网络诊断..." bash network_diag.sh echo "所有诊断包已生成" ls -lh /tmp/*.tar.gz
使用建议
-
脚本权限

chmod +x collect_diag.sh
-
定时自动化
# 添加crontab 0 */6 * * * /path/to/collect_diag.sh
-
远程收集
# SSH远程执行 ssh user@server 'bash -s' < collect_diag.sh
批量收集
for host in server1 server2 server3; do ssh $host 'bash -s' < collect_diag.sh & done wait
这些脚本可以根据具体需求修改,添加或删除收集项,建议将脚本保存到版本控制中,方便管理和更新。