运维脚本示例:监控诊断(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;事件类型可按需增加
modify、delete。 - busy 目录会产生大量事件,应 debounce 或换消息队列方案。
rsync目标/tmp/opt仅为示例;生产注意权限与带宽。
六、小结
这类脚本适合 中小型现场巡检;大规模基础设施建议 Prometheus node_exporter + Grafana、统一日志与告警平台。
