
10 个 Linux 运维神器脚本01服务器性能监控脚本快速获取 CPU / 内存 / 磁盘使用率 monitor.sh#!/bin/bash # 服务器性能监控脚本 # 用法: ./monitor.sh TIMESTAMP$(date %Y-%m-%d %H:%M:%S) # CPU 负载 LOAD_AVG$(uptime | awk -Fload 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 NR2 {print $5}) echo 系统性能监控 ($TIMESTAMP) echo CPU 负载 (1min/5min/15min): $LOAD_AVG echo 内存使用率: ${MEM_USAGE_PERCENT}% (${MEM_USED}MB / ${MEM_TOTAL}MB) echo 根分区磁盘使用率: $DISK_USAGE用法chmod x ./monitor.sh定时*/5 * * * * 写入日志 注入可加入iostat -x 1 3获取磁盘 IOPS或ss -s看 TCP 连接数 阿里云可配合 ARMS 自定义指标上报实现钉钉告警02日志清理脚本自动清理 N 天前的日志文件 clear_log.sh#!/bin/bash # 日志清理脚本 # 用法: ./clear_log.sh LOG_DIR/var/log/app DAYS7 echo [$(date)] 开始清理 $LOG_DIR 下 ${DAYS} 天前的 .log 文件... find $LOG_DIR -name *.log -mtime $DAYS -type f | while read f; do echo 删除: $f rm -f $f done # 同时清理空目录 find $LOG_DIR -type d -empty -delete echo [$(date)] 清理完成 注入-mtime $DAYS可改为-mmin $MINUTES按分钟清理⚠️ 生产环境建议先find ... -print预览再执行删除03自动备份脚本打包压缩 自动清理旧备份 backup.sh#!/bin/bash # 自动备份脚本 # 用法: ./backup.sh SRC_DIR/data BACKUP_DIR/backup DATE$(date %Y%m%d_%H%M%S) BACKUP_FILEbackup_${DATE}.tar.gz KEEP_DAYS30 mkdir -p $BACKUP_DIR echo [$(date)] 开始备份 $SRC_DIR ... tar -zcf $BACKUP_DIR/$BACKUP_FILE $SRC_DIR 2/dev/null if [ $? -eq 0 ]; then echo 备份成功: $BACKUP_DIR/$BACKUP_FILE # 删除旧备份 find $BACKUP_DIR -name backup_*.tar.gz \ -mtime $KEEP_DAYS -exec rm -f {} \; echo 已清理 ${KEEP_DAYS} 天前的旧备份 else echo 备份失败请检查目录权限 exit 1 fi 注入阿里云可用ossutil cp同步到 OSS再做跨地域复制 重要数据备份后建议gpg加密或做完整性校验04批量检查服务状态自动检测 尝试重启 check_service.sh#!/bin/bash # 批量检查服务状态脚本 # 用法: ./check_service.sh SERVICES(nginx mysql redis docker) for SERVICE in ${SERVICES[]}; do systemctl is-active --quiet $SERVICE if [ $? -eq 0 ]; then echo ✅ $SERVICE 正在运行 else echo ⚠️ $SERVICE 未运行尝试重启... systemctl restart $SERVICE if [ $? -eq 0 ]; then echo ✅ $SERVICE 重启成功 else echo ❌ $SERVICE 重启失败请手动检查 # 发送告警阿里云可调用 DingTalk Webhook fi fi done 注入可加入systemctl status $SERVICE输出到日志 阿里云可配合 ARMS 事件中心服务异常自动触发告警通知05批量文件重命名给目录下文件统一加前缀 rename_files.sh#!/bin/bash # 批量文件重命名脚本 # 用法: ./rename_files.sh /path/to/dir PREFIX_ DIR${1:-.} PREFIX${2:-backup_} echo 目标目录: $DIR echo 文件名前缀: $PREFIX echo ------------------------ for FILE in $DIR/*; do [ -f $FILE ] || continue BASENAME$(basename $FILE) NEW_NAME$DIR/${PREFIX}${BASENAME} mv $FILE $NEW_NAME 2/dev/null echo 重命名: $BASENAME → ${PREFIX}${BASENAME} done echo ------------------------ echo 文件重命名完成 支持参数化./rename_files.sh /data/logs/ 2026_⚠️ 重命名前建议先cp -r备份原目录06磁盘空间告警脚本超过阈值自动发邮件 / Webhook 告警 disk_alert.sh#!/bin/bash # 磁盘空间告警脚本 # 用法: ./disk_alert.sh THRESHOLD80 EMAILadminexample.com PARTITION/ DISK_USAGE$(df -h $PARTITION | awk NR2 {print $5} | cut -d% -f1) if [ $DISK_USAGE -gt $THRESHOLD ]; then MSG[告警] 磁盘使用率达到 ${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_tokenxxx \ # -H Content-Type: application/json \ # -d {\msgtype\:\text\,\text\:{\content\:\$MSG\}} fi 磁盘满会导致服务宕机建议阈值设为 80% 提前告警 注入阿里云可在 SLS 中配置告警规则无需自建脚本07清理僵尸进程批量杀掉僵尸进程Z 状态 kill_zombies.sh#!/bin/bash # 清理僵尸进程脚本 # 用法: ./kill_zombies.sh ZOMBIES$(ps aux | awk $8 ~ /Z/ {print $2}) if [ -z $ZOMBIES ]; then echo 未发现僵尸进程 exit 0 fi echo 发现僵尸进程 PID: $ZOMBIES echo ------------------------ for PID in $ZOMBIES; do # 僵尸进程无法被 kill -9 杀死 # 需要杀掉其父进程 PPID$(ps -o ppid -p $PID | tr -d ) echo 僵尸进程 $PID父进程: $PPID echo 尝试重启父进程 $PPID ... systemctl restart $(ps -o unit -p $PPID | tr -d ) done echo ------------------------ echo 清理完成建议检查父进程状态⚠️ 僵尸进程无法用 kill -9 杀死必须处理其父进程 频繁出现僵尸进程说明应用程序有 bug需修复代码逻辑08批量修改文件权限递归设置目录权限 chmod_files.sh#!/bin/bash # 批量修改文件权限脚本 # 用法: ./chmod_files.sh /path/to/dir 755 DIR${1:-/var/www/html} PERMISSION${2:-755} echo 目标目录: $DIR echo 设置权限: $PERMISSION echo ------------------------ chmod -R $PERMISSION $DIR if [ $? -eq 0 ]; then echo 权限设置成功 echo 验证: find $DIR -maxdepth 2 -ls | head -10 else echo 权限设置失败请检查目录是否存在 fi Web 目录推荐755目录644文件⚠️ 谨慎使用chmod -R 777存在严重安全风险09网络连接统计脚本统计 TCP 各状态连接数 netstat.sh#!/bin/bash # 网络连接统计脚本 # 用法: ./netstat.sh echo TCP 连接状态统计 netstat -ant 2/dev/null | awk /^tcp/ {print $6} | sort | uniq -c | sort -nr echo echo 连接数 TOP 10 IP netstat -ant 2/dev/null | awk /^tcp/ {print $5} | cut -d: -f1 | sort | uniq -c | sort -nr | head -10 echo echo 当前 ESTABLISHED 连接数 ESTABLISHED$(netstat -ant 2/dev/null | grep -c ESTABLISHED) echo ESTABLISHED: $ESTABLISHED 注入SYN_RECV 过多可能是 SYN Flood 攻击配合ss -tan state syn-recv | wc -l确认 阿里云可在 SLS 接入防火墙日志做实时分析10自动同步时间脚本确保服务器时间与 NTP 同步 sync_time.sh#!/bin/bash # 自动同步时间脚本 # 用法: ./sync_time.sh NTP_SERVERpool.ntp.org MAX_OFFSET500 # 毫秒 echo 当前时间: $(date) # 检查 ntpdate 或 chronyc 是否可用 if command -v ntpdate /dev/null; then ntpdate $NTP_SERVER RESULT$? elif command -v chronyc /dev/null; then chronyc makestep RESULT$? else echo 未找到 ntpdate 或 chronyd请先安装 exit 1 fi if [ $RESULT -eq 0 ]; then echo ✅ 时间同步成功: $(date) # 写入硬件时钟 hwclock --systohc else echo ❌ 时间同步失败请检查网络或 NTP 服务 fi 生产环境推荐用chrony替代 ntpdate已废弃⚠️ 时间跳变可能导致数据库主从复制异常建议用chronyc makestep平滑同步