一、日志清理与归档
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
八、使用建议
-
脚本统一放
/opt/scripts/,加执行权限:chmod +x *.sh -
重要操作先 echo 再执行,确认无误再真跑。
-
日志类脚本加日志输出 ,方便排查:
>> /var/log/script.log 2>&1 -
删除类操作先用
-print测试 ,比如find ... -print确认后再改-delete。 -
生产环境慎用
kill -9和rm -rf,最好加白名单或二次确认。