Skip to content

运维脚本示例:监控诊断(CPU、内存、磁盘、网络、文件同步)

一、占用 CPU / 内存最高的进程(Top 10)

shell
ps -eo user,pid,pcpu,pmem,args --sort=-pcpu  |head -n 10

ps -eo user,pid,pcpu,pmem,args --sort=-pmem  |head -n 10

可按需加上 --no-headers、过滤进程名,或改用 top -b -n 1


二、一键查看服务器资源(CPU、内存、磁盘、TCP)

脚本定义 cpu memory disk tcp_status 四个函数并依次调用;vmstat/free/df/ss 字段位置随版本略有差异,部署前请在目标系统验证 awk 行号。

shell
#!/bin/bash
function cpu() {
    NUM=1
    while [ $NUM -le 3 ]; do
        util=`vmstat |awk '{if(NR==3)print 100-$15"%"}'`
        user=`vmstat |awk '{if(NR==3)print $13"%"}'`
        sys=`vmstat |awk '{if(NR==3)print $14"%"}'`
        iowait=`vmstat |awk '{if(NR==3)print $16"%"}'`
        echo "CPU - 使用率: $util , 等待磁盘IO响应使用率: $iowait"
        let NUM++
        sleep 1
    done
}

function memory() {
    total=`free -m |awk '{if(NR==2)printf "%.1f",$2/1024}'`
    used=`free -m |awk '{if(NR==2) printf "%.1f",($2-$NF)/1024}'`
    available=`free -m |awk '{if(NR==2) printf "%.1f",$NF/1024}'`
    echo "内存 - 总大小: ${total}G , 使用: ${used}G , 剩余: ${available}G"
}

function disk() {
    fs=$(df -h |awk '/^\/dev/{print $1}')
    for p in $fs; do
        mounted=$(df -h |awk '$1=="'$p'"{print $NF}')
        size=$(df -h |awk '$1=="'$p'"{print $2}')
        used=$(df -h |awk '$1=="'$p'"{print $3}')
        used_percent=$(df -h |awk '$1=="'$p'"{print $5}')
        echo "硬盘 - 挂载点: $mounted , 总大小: $size , 使用: $used , 使用率: $used_percent"
    done
}

function tcp_status() {
    summary=$(ss -antp |awk '{status[$1]++}END{for(i in status) printf i":"status[i]" "}')
    echo "TCP连接状态 - $summary"
}

cpu
memory
disk
tcp_status

三、网卡实时流量(/proc/net/dev)

传入网卡名参数,每秒打印接收/发送速率(KB/s)。

shell
#!/bin/bash
NIC=$1
echo -e " In ------ Out"
while true; do
    OLD_IN=$(awk '$0~"'$NIC'"{print $2}' /proc/net/dev)
    OLD_OUT=$(awk '$0~"'$NIC'"{print $10}' /proc/net/dev)
    sleep 1
    NEW_IN=$(awk  '$0~"'$NIC'"{print $2}' /proc/net/dev)
    NEW_OUT=$(awk '$0~"'$NIC'"{print $10}' /proc/net/dev)
    IN=$(printf "%.1f%s" "$((($NEW_IN-$OLD_IN)/1024))" "KB/s")
    OUT=$(printf "%.1f%s" "$((($NEW_OUT-$OLD_OUT)/1024))" "KB/s")
    echo "$IN $OUT"
    sleep 1
done

补充:字段 $2/$10 随内核统计项排列可能变化;高流量机器可用 字节差 / 秒 再用 awk 算 KB/MB。脚本未校验 $1 为空。


四、多台主机磁盘使用率(SSH + 阈值告警)

host.info 取主机列表,SSH 执行 df -h,解析挂载点与使用率整数部分,≥80 打印 Warning。

shell
#!/bin/bash
HOST_INFO=host.info
for IP in $(awk '/^[^#]/{print $1}' $HOST_INFO); do
    USER=$(awk -v ip=$IP 'ip==$1{print $2}' $HOST_INFO)
    PORT=$(awk -v ip=$IP 'ip==$1{print $3}' $HOST_INFO)
    TMP_FILE=/tmp/disk.tmp
    ssh -p $PORT $USER@$IP 'df -h' > $TMP_FILE
    USE_RATE_LIST=$(awk 'BEGIN{OFS="="}/^\/dev/{print $NF,int($5)}' $TMP_FILE)
    for USE_RATE in $USE_RATE_LIST; do
        PART_NAME=${USE_RATE%=*}
        USE_RATE=${USE_RATE#*=}
        if [ $USE_RATE -ge 80 ]; then
            echo "Warning: $PART_NAME Partition usage $USE_RATE%!"
        fi
    done
done

补充:需 免密 SSH 或可交互输入密码;公网建议密钥 + StrictHostKeyChecking 策略。阈值与临时文件路径可按环境调整。


五、目录变更监控与 rsync 同步

使用 inotifywait 监控目录 create 事件,触发 rsync。邮件行为在脚本中注释掉。

shell
#!/bin/bash

MON_DIR=/opt
inotifywait -mqr --format %f -e create $MON_DIR |\
while read files; do
   rsync -avz /opt /tmp/opt
   #echo "$(date +'%F %T') create $files" | mail -s "dir monitor" alert@example.com
done

补充

  • 需安装 inotify-tools;事件类型可按需增加 modifydelete
  • busy 目录会产生大量事件,应 debounce 或换消息队列方案。
  • rsync 目标 /tmp/opt 仅为示例;生产注意权限与带宽。

六、小结

这类脚本适合 中小型现场巡检;大规模基础设施建议 Prometheus node_exporter + Grafana、统一日志与告警平台。