15个实用Linux运维脚本

一、日志清理与归档

1. 按天清理 Nginx 旧日志(保留 7 天)

bash

bash 复制代码
#!/bin/bash
LOG_DIR="/var/log/nginx"
KEEP_DAYS=7

find "$LOG_DIR" -name "*.log" -mtime +$KEEP_DAYS -exec rm -f {} \;
echo "已清理 $KEEP_DAYS 天前的日志"

用途:防止磁盘被日志打满。


2. 日志按天切割并压缩

bash

bash 复制代码
#!/bin/bash
LOG="/var/log/app/app.log"
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)

if [ -f "$LOG" ]; then
    cp "$LOG" "${LOG}.${YESTERDAY}"
    > "$LOG"
    gzip "${LOG}.${YESTERDAY}"
    echo "已切割并压缩: ${LOG}.${YESTERDAY}.gz"
fi

用途:配合 crontab 每天凌晨执行。


二、磁盘与系统巡检

3. 磁盘使用率告警(超过 80% 输出)

bash

bash 复制代码
#!/bin/bash
THRESHOLD=80

df -h | awk -v t=$THRESHOLD 'NR>1 && $5+0 > t {print "警告: " $6 " 使用率 " $5}'

用途:接入监控或定时邮件。


4. 内存 + 负载 + 磁盘一键巡检

bash

bash 复制代码
#!/bin/bash
echo "===== 磁盘 ====="
df -h | awk 'NR>1 && $5+0 > 80 {print $6, $5}'

echo "===== 内存 ====="
free -m | awk 'NR==2 {print "已用:" $3 "MB  剩余:" $4 "MB"}'

echo "===== 负载 ====="
uptime | awk -F'load average:' '{print $2}'

echo "===== Top 5 CPU 进程 ====="
ps aux --sort=-%cpu | head -6

用途:每天早上一键看机器健康度。


5. 查找大文件(超过 1G)

bash

bash 复制代码
#!/bin/bash
find / -type f -size +1G -exec ls -lh {} \; 2>/dev/null | awk '{print $5, $9}'

用途:磁盘爆了快速定位。


三、进程与服务管理

6. 服务挂了自动重启

bash

bash 复制代码
#!/bin/bash
SERVICE="nginx"

if ! pgrep -x "$SERVICE" > /dev/null; then
    echo "$(date) $SERVICE 已挂,正在重启..." >> /var/log/service_monitor.log
    systemctl restart "$SERVICE"
fi

用途:配合 crontab 每分钟检查一次。


7. 杀占用 CPU 最高的进程

bash

bash 复制代码
#!/bin/bash
PID=$(ps aux --sort=-%cpu | awk 'NR==2 {print $2}')
echo "杀掉 CPU 最高进程 PID: $PID"
kill -9 "$PID"

用途:紧急降负载,慎用。


8. 批量检查多台服务器端口

bash

bash 复制代码
#!/bin/bash
HOSTS=("192.168.1.10" "192.168.1.11" "192.168.1.12")
PORT=22

for host in "${HOSTS[@]}"; do
    if timeout 2 bash -c "echo > /dev/tcp/$host/$PORT" 2>/dev/null; then
        echo "$host:$PORT 正常"
    else
        echo "$host:$PORT 不通"
    fi
done

用途:批量巡检机器存活。


四、文件与配置批量处理

9. 批量替换多台机器配置里的 IP

bash

bash 复制代码
#!/bin/bash
OLD_IP="10.0.0.1"
NEW_IP="10.0.0.2"
CONF_DIR="/etc/app"

for file in "$CONF_DIR"/*.conf; do
    if grep -q "$OLD_IP" "$file"; then
        sed -i "s/$OLD_IP/$NEW_IP/g" "$file"
        echo "已替换: $file"
    fi
done

用途:服务器迁移、IP 变更。


10. 批量重命名文件(加日期后缀)

bash

bash 复制代码
#!/bin/bash
DATE=$(date +%Y%m%d)

for file in *.log; do
    mv "$file" "${file%.log}_${DATE}.log"
done

用途:归档备份。


11. 统计目录下文件数量和总大小

bash

bash 复制代码
#!/bin/bash
DIR="/data"

COUNT=$(find "$DIR" -type f | wc -l)
SIZE=$(du -sh "$DIR" | awk '{print $1}')

echo "目录: $DIR"
echo "文件数: $COUNT"
echo "总大小: $SIZE"

用途:快速了解数据目录情况。


五、备份脚本

12. MySQL 自动备份并删除 7 天前

bash

bash 复制代码
#!/bin/bash
DB_USER="root"
DB_PASS="password"
DB_NAME="mydb"
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d)

mkdir -p "$BACKUP_DIR"
mysqldump -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" | gzip > "$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz"

find "$BACKUP_DIR" -name "*.sql.gz" -mtime +7 -delete
echo "备份完成: ${DB_NAME}_${DATE}.sql.gz"

用途:每天定时备份数据库。


13. 目录增量备份(用 rsync)

bash

bash 复制代码
#!/bin/bash
SRC="/data/"
DST="/backup/data/"

rsync -avz --delete "$SRC" "$DST"
echo "同步完成: $(date)"

用途:本地或远程目录备份。


六、物流/费用场景专用脚本

结合你前面问的货车费用,这个脚本可以批量算运费:

14. 批量计算物流费用

假设 price.txt 格式:线路 车型 单价 数量

bash

bash 复制代码
#!/bin/bash
FILE="price.txt"

echo "===== 明细 ====="
awk '{print $1, $2, "金额:" $3*$4}' "$FILE"

echo "===== 总金额 ====="
awk '{sum += $3*$4} END {print sum "元"}' "$FILE"

15. 统计每条线路的总费用

bash

bash 复制代码
#!/bin/bash
FILE="price.txt"

awk '{total[$1] += $3*$4} END {for (line in total) print line, total[line]}' "$FILE" | sort -rn -k2

七、定时任务配置参考

把常用脚本加入 crontab:

bash

bash 复制代码
# 每天凌晨 2 点清理日志
0 2 * * * /opt/scripts/clean_log.sh

# 每 5 分钟检查服务
*/5 * * * * /opt/scripts/monitor_service.sh

# 每天凌晨 3 点备份数据库
0 3 * * * /opt/scripts/backup_mysql.sh

# 每天早上 8 点巡检
0 8 * * * /opt/scripts/check_system.sh

八、使用建议

  1. 脚本统一放 /opt/scripts/ ,加执行权限:chmod +x *.sh

  2. 重要操作先 echo 再执行,确认无误再真跑。

  3. 日志类脚本加日志输出 ,方便排查:>> /var/log/script.log 2>&1

  4. 删除类操作先用 -print 测试 ,比如 find ... -print 确认后再改 -delete。

  5. 生产环境慎用 kill -9 和 rm -rf,最好加白名单或二次确认。

相关推荐
无足鸟ICT3 小时前
【RHCA+】影响Linux系统性能的因素
linux·运维·服务器
沫璃染墨4 小时前
从零入门计算机网络系列(十):HTTP协议进阶——从资源路径解析到状态码与请求头详解
linux·运维·服务器·网络·c++·http
oioihoii4 小时前
Windows部署MySpeed自建测速服务:Docker运行后直接测速,再配置固定公网地址远程查看
运维·docker·容器
小则又沐风a4 小时前
深入了解五种IO模型与非阻塞IO
linux
Sayai4 小时前
Ubuntu 开发环境搭建避坑(一):网卡 EEE 致 60% 周期性丢包,Realtek RTL8125 网络黑洞排查与修复
linux·运维·网络·ubuntu·性能优化
墨染天姬4 小时前
【linux 网络1】数据怎么进网卡到内核?
linux·运维·网络
迪康coolmu4 小时前
金融客户数据合规落地:基于迪康端点安全一体化管理系统的四道防线实践
运维·服务器·数据库·经验分享·安全·网络安全·金融
崇子嵘4 小时前
上云方案硬件部分分析
linux
小嘉丶学长4 小时前
Day13 · 列表与元组
linux·运维·服务器·开发语言·python
时间售卖铺4 小时前
MySQL事务ACID与隔离级别深度解析
运维·数据库·mysql·云原生