当前位置:首页>Linux>10 个 Linux 运维神器脚本

10 个 Linux 运维神器脚本

  • 2026-10-11 07:46:07
10 个 Linux 运维神器脚本
 
🛠️ LINUX 运维实战
 

10 个 Linux 运维
神器脚本

 

拆解 + 重构 + 注入 · 拿来即用

 

💡 日常运维中大量重复任务:监控性能、清理日志、备份数据、检查服务……手动操作低效且易出错。
这 10 个脚本涵盖监控 / 日志 / 备份 / 进程管理,拿来即用,事半功倍。

 
   01    
     

服务器性能监控脚本

     

快速获取 CPU / 内存 / 磁盘使用率

   
 
 
   
                       monitor.sh    
   
#!/bin/bash
# 服务器性能监控脚本
# 用法: ./monitor.sh

TIMESTAMP=$(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}')

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"
DAYS=7

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_FILE="backup_${DATE}.tar.gz"
KEEP_DAYS=30

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

THRESHOLD=80
EMAIL="admin@example.com"
PARTITION="/"

DISK_USAGE=$(df -h "$PARTITION" | awk 'NR==2 {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_token=xxx" \
    #   -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_SERVER="pool.ntp.org"
MAX_OFFSET=500  # 毫秒

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 平滑同步

 
 
   

📋 10 个脚本速查表

 
 
   
     
脚本
     
核心命令
     
场景
     
监控脚本
     
uptime / free / df
     
快速排查
     
日志清理
     
find -mtime +N
     
防磁盘满
     
自动备份
     
tar -zcf
     
数据安全
     
服务检查
     
systemctl is-active
     
自动恢复
     
文件重命名
     
mv + basename
     
日志归档
     
磁盘告警
     
df + mail / curl
     
提前预警
     
僵尸进程
     
ps aux | awk '$8~/Z/'
     
资源泄漏
     
权限修改
     
chmod -R
     
Web部署
     
连接统计
     
netstat -ant | awk
     
网络排查
     
时间同步
     
ntpdate / chronyc
     
分布式系统
   
 
 
   

☁️ 阿里云场景实战建议

 
 
   
     

监控告警

     

用云监控替代 crontab 脚本,支持多通道通知(短信/钉钉/邮件)

   
   
     

日志清理

     

SLS 日志服务可设置自动过期,无需手动清理磁盘日志

   
   
     

数据备份

     

ECS 快照 + OSS 跨地域复制,比本地 tar 备份更可靠

   
   
     

服务高可用

     

用 SLB + 健康检査替代单节点服务监控,自动摘除异常节点

   
 
 

技术与架构之美 · 持续输出干货

 

拆解 · 重构 · 注入 —— 让每篇文章都有灵魂

最新文章

随机文章