如何用脚本快速收集诊断包

wen 实用脚本 3

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

使用建议

  1. 脚本权限

    如何用脚本快速收集诊断包

    chmod +x collect_diag.sh
  2. 定时自动化

    # 添加crontab
    0 */6 * * * /path/to/collect_diag.sh
  3. 远程收集

    # 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


这些脚本可以根据具体需求修改,添加或删除收集项,建议将脚本保存到版本控制中,方便管理和更新。

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