文章目录
- 服务器性能监控脚本
- 日志清理脚本
- 自动备份脚本
- 批量检查服务状态
- 批量文件重命名
- 磁盘空间告警脚本
- 清理僵尸进程
- 批量修改文件权限
- 网络连接统计脚本
- 自动同步时间脚本
服务器性能监控脚本
快速获取 CPU / 内存 / 磁盘使用率
#!/bin/bashTIMESTAMP=$(date'+%Y-%m-%d %H:%M:%S')# CPU 负载LOAD_AVG=$(uptime|awk-F'load average:''{print $2}')# 内存使用率MEM_TOTAL=$(free-m|awk'/Mem:/ {print $2}')MEM_USED=$(free-m|awk'/Mem:/ {print $3}')MEM_USAGE_PERCENT=$((MEM_USED*100/MEM_TOTAL))# 磁盘使用率DISK_USAGE=$(df-h/|awk'NR==2 {print $5}')# 磁盘ioecho"===== 系统性能监控 ($TIMESTAMP) ====="echo"CPU 负载 (1min/5min/15min):$LOAD_AVG"echo"内存使用率:${MEM_USAGE_PERCENT}% (${MEM_USED}MB /${MEM_TOTAL}MB)"echo"根分区磁盘使用率:$DISK_USAGE"日志清理脚本
自动清理 N 天前的日志文件
#!/bin/bashLOG_DIR="/var/log/app"DAYS=7echo"[$(date)] 开始清理$LOG_DIR下${DAYS}天前的 .log 文件..."find"$LOG_DIR"-name"*.log"-mtime+$DAYS-typef|whilereadf;doecho"删除:$f"rm-f"$f"done# 同时清理空目录find"$LOG_DIR"-typed-empty-deleteecho"[$(date)] 清理完成"自动备份脚本
打包压缩 + 自动清理旧备份
#!/bin/bashSRC_DIR="/data"BACKUP_DIR="/backup"DATE=$(date'+%Y%m%d_%H%M%S')BACKUP_FILE="backup_${DATE}.tar.gz"KEEP_DAYS=30mkdir-p"$BACKUP_DIR"echo"[$(date)] 开始备份$SRC_DIR..."tar-zcf"$BACKUP_DIR/$BACKUP_FILE""$SRC_DIR"2>/dev/nullif[$?-eq0];thenecho"备份成功:$BACKUP_DIR/$BACKUP_FILE"# 删除旧备份find"$BACKUP_DIR"-name"backup_*.tar.gz"\-mtime+$KEEP_DAYS-execrm-f{}\;echo"已清理${KEEP_DAYS}天前的旧备份"elseecho"备份失败!请检查目录权限"exit1fi批量检查服务状态
自动检测 + 尝试重启
#!/bin/bashSERVICES=("nginx""mysql""redis""docker")forSERVICEin"${SERVICES[@]}";dosystemctl is-active--quiet"$SERVICE"if[$?-eq0];thenecho"✅$SERVICE正在运行"elseecho"⚠️$SERVICE未运行,尝试重启..."systemctl restart"$SERVICE"if[$?-eq0];thenecho"✅$SERVICE重启成功"elseecho"❌$SERVICE重启失败,请手动检查!"# 发送告警(阿里云可调用 DingTalk Webhook)fifidone批量文件重命名
给目录下文件统一加前缀
#!/bin/bashDIR="${1:-.}"PREFIX="${2:-backup_}"echo"目标目录:$DIR"echo"文件名前缀:$PREFIX"echo"------------------------"forFILEin"$DIR"/*;do[-f"$FILE"]||continueBASENAME=$(basename"$FILE")NEW_NAME="$DIR/${PREFIX}${BASENAME}"mv"$FILE""$NEW_NAME"2>/dev/nullecho"重命名:$BASENAME→${PREFIX}${BASENAME}"doneecho"------------------------"echo"文件重命名完成!"磁盘空间告警脚本
超过阈值自动发邮件 / Webhook 告警
#!/bin/bashTHRESHOLD=80EMAIL="admin@example.com"PARTITION="/"DISK_USAGE=$(df-h"$PARTITION"|awk'NR==2 {print $5}'|cut-d'%'-f1)if["$DISK_USAGE"-gt"$THRESHOLD"];thenMSG="[告警] 磁盘使用率达到${DISK_USAGE}%!分区:$PARTITION"echo"$MSG"# 方式1: 邮件告警(需配置 mail / postfix)echo"$MSG"|mail-s"磁盘空间告警 -$(hostname)""$EMAIL"# 方式2: 钉钉 Webhook(推荐)# curl -X POST "https://oapi.dingtalk.com/robot/send?access_token=xxx" \# -H 'Content-Type: application/json' \# -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$MSG\"}}"fi清理僵尸进程
批量杀掉僵尸进程(Z 状态)
#!/bin/bashZOMBIES=$(psaux|awk'$8 ~ /Z/ {print $2}')if[-z"$ZOMBIES"];thenecho"未发现僵尸进程"exit0fiecho"发现僵尸进程 PID:$ZOMBIES"echo"------------------------"forPIDin$ZOMBIES;do# 僵尸进程无法被 kill -9 杀死# 需要杀掉其父进程PPID=$(ps-oppid=-p"$PID"|tr-d' ')echo"僵尸进程$PID,父进程:$PPID"echo"尝试重启父进程$PPID..."systemctl restart"$(ps-ounit=-p"$PPID"|tr-d' ')"doneecho"------------------------"echo"清理完成,建议检查父进程状态"批量修改文件权限
递归设置目录权限
Web目录推荐755(目录)+644(文件)
#!/bin/bashDIR="${1:-/var/www/html}"PERMISSION="${2:-755}"echo"目标目录:$DIR"echo"设置权限:$PERMISSION"echo"------------------------"chmod-R"$PERMISSION""$DIR"if[$?-eq0];thenecho"权限设置成功!"echo"验证:"find"$DIR"-maxdepth2-ls|head-10elseecho"权限设置失败,请检查目录是否存在"fi网络连接统计脚本
统计 TCP 各状态连接数
#!/bin/bashecho"===== TCP 连接状态统计 ====="netstat-ant2>/dev/null|awk'/^tcp/ {print $6}'|sort|uniq-c|sort-nrecho""echo"===== 连接数 TOP 10 IP ====="netstat-ant2>/dev/null|awk'/^tcp/ {print $5}'|cut-d:-f1|sort|uniq-c|sort-nr|head-10echo""echo"===== 当前 ESTABLISHED 连接数 ====="ESTABLISHED=$(netstat-ant2>/dev/null|grep-cESTABLISHED)echo"ESTABLISHED:$ESTABLISHED"自动同步时间脚本
确保服务器时间与 NTP 同步
#!/bin/bashNTP_SERVER="pool.ntp.org"MAX_OFFSET=500# 毫秒echo"===== 当前时间:$(date)====="# 检查 ntpdate 或 chronyc 是否可用ifcommand-vntpdate&>/dev/null;thenntpdate"$NTP_SERVER"RESULT=$?elifcommand-vchronyc&>/dev/null;thenchronyc makestepRESULT=$?elseecho"未找到 ntpdate 或 chronyd,请先安装"exit1fiif[$RESULT-eq0];thenecho"✅ 时间同步成功:$(date)"# 写入硬件时钟hwclock--systohcelseecho"❌ 时间同步失败,请检查网络或 NTP 服务"fi