整理运维工作中最实用的自动化脚本,让重复工作一键完成。

在Linux运维工作中,善用脚本可以极大提升效率。本文整理了运维工作中最常用的脚本示例,覆盖日志清理、备份、监控、系统检查等场景,拿来即用。

PART 01

日志管理脚本

1. 自动清理过期日志

日志文件占用过多磁盘空间是常见问题,通过脚本自动清理可有效避免。

#!/bin/bash
# auto_clean_logs.sh - 清理指定目录下N天前的日志文件

LOG_DIR="/var/log/myapp"
DAYS=30

find $LOG_DIR -name "*.log" -type f -mtime +$DAYS -exec rm -f {} \;
echo "$(date): Cleaned logs older than $DAYS days in $LOG_DIR" >> /var/log/cleanup.log

2. 日志压缩归档

将7天前的日志压缩归档,节省空间的同时保留历史数据。

#!/bin/bash
# archive_logs.sh - 压缩归档7天前的日志

LOG_DIR="/var/log/myapp"
ARCHIVE_DIR="/backup/logs"
DAYS=7

mkdir -p $ARCHIVE_DIR
find $LOG_DIR -name "*.log" -type f -mtime +$DAYS -exec gzip {} \;
find $LOG_DIR -name "*.log.gz" -type f -mtime +$DAYS -exec mv {} $ARCHIVE_DIR \;
echo "$(date): Archived logs older than $DAYS days" >> /var/log/archive.log

PART 02

备份脚本

3. 数据库备份脚本(MySQL)

#!/bin/bash
# mysql_backup.sh - MySQL数据库备份

DB_NAME="production_db"
DB_USER="root"
DB_PASS="your_password"
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
KEEP_DAYS=7

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

# 删除7天前的备份
find $BACKUP_DIR -name "*.sql.gz" -type f -mtime +$KEEP_DAYS -delete

echo "$(date): MySQL backup completed: ${DB_NAME}_${DATE}.sql.gz"

4. 目录增量备份(rsync)

使用rsync实现增量备份,高效且节省空间。

#!/bin/bash
# rsync_backup.sh - 使用rsync进行增量备份

SOURCE_DIR="/data/"
BACKUP_DIR="/backup/data/"
EXCLUDE_FILE="/backup/exclude.list"

# 排除文件列表示例
# *.tmp
# cache/
# logs/*.log

rsync -avz --delete --exclude-from=$EXCLUDE_FILE $SOURCE_DIR $BACKUP_DIR

echo "$(date): Rsync backup completed" >> /var/log/backup.log

PART 03

系统监控脚本

5. 服务器健康检查

#!/bin/bash
# health_check.sh - 服务器健康状态检查

echo "========== 服务器健康检查报告 =========="
echo "检查时间: $(date)"
echo ""

# CPU负载
echo "--- CPU负载 ---"
load_avg=$(uptime | awk -F'load average:' '{print $2}')
echo "负载均值: $load_avg"
echo ""

# 内存使用
echo "--- 内存使用 ---"
free -h | grep -E "Mem|Swap"
echo ""

# 磁盘使用
echo "--- 磁盘使用 ---"
df -h | grep -v tmpfs | grep -v udev
echo ""

# 系统运行时间
echo "--- 系统运行时间 ---"
uptime -p
echo ""

# 最近登录
echo "--- 最近登录用户 ---"
last -n 5 | grep -v "^$"
echo ""

# 检查关键服务
echo "--- 关键服务状态 ---"
services=("nginx" "mysql" "ssh")
for svc in "${services[@]}"; do
    if systemctl is-active --quiet $svc; then
        echo "$svc: ✓ 运行中"
    else
        echo "$svc: ✗ 已停止"
    fi
done

6. 磁盘使用率告警脚本

#!/bin/bash
# disk_alert.sh - 磁盘空间告警

THRESHOLD=80
EMAIL="admin@example.com"
WARN_FILE="/tmp/disk_warn.txt"

df -h | grep -v tmpfs | grep -v udev | while read line; do
    usage=$(echo $line | awk '{print $5}' | sed 's/%//')
    mount=$(echo $line | awk '{print $6}')
    if [ $usage -gt $THRESHOLD ]; then
        echo "警告: 分区 $mount 使用率已达 $usage% (阈值: $THRESHOLD%)" >> $WARN_FILE
    fi
done

if [ -s $WARN_FILE ]; then
    cat $WARN_FILE | mail -s "磁盘空间告警" $EMAIL
    rm -f $WARN_FILE
fi

7. 端口连通性检查

#!/bin/bash
# port_check.sh - 检查服务端口是否正常

HOST="localhost"
PORTS=("80" "443" "3306" "6379")

for port in "${PORTS[@]}"; do
    nc -zv $HOST $port &> /dev/null
    if [ $? -eq 0 ]; then
        echo "✓ 端口 $port 正常"
    else
        echo "✗ 端口 $port 异常"
    fi
done

PART 04

系统维护脚本

8. 定时清理内存缓存

#!/bin/bash
# clear_cache.sh - 清理系统内存缓存

# 同步磁盘数据
sync

# 清理页缓存、目录项和inode
echo 3 > /proc/sys/vm/drop_caches

echo "$(date): System cache cleared" >> /var/log/cache_clean.log

9. 批量修改文件权限

#!/bin/bash
# fix_permissions.sh - 批量修复文件权限

WEB_DIR="/var/www/html"

# 目录755,文件644
find $WEB_DIR -type d -exec chmod 755 {} \;
find $WEB_DIR -type f -exec chmod 644 {} \;

# 特定目录开放写入权限
chmod 775 $WEB_DIR/uploads
chmod 775 $WEB_DIR/cache

echo "$(date): Permissions fixed for $WEB_DIR"

10. 查找并清理大文件

#!/bin/bash
# find_large_files.sh - 查找并清理大文件

SEARCH_DIR="/"
SIZE="+500M"
LOG_FILE="/tmp/large_files.log"

echo "正在查找大于500MB的文件..."
find $SEARCH_DIR -type f -size $SIZE -exec ls -lh {} \; | tee $LOG_FILE

echo "查找到以下大文件,请确认后删除:"
cat $LOG_FILE

# 如需自动删除,取消下面注释(慎用!)
# find $SEARCH_DIR -type f -size $SIZE -exec rm -f {} \;

PART 05

用户管理脚本

11. 批量创建用户

#!/bin/bash
# batch_create_users.sh - 批量创建用户

USER_FILE="user_list.txt"

# user_list.txt 格式: username:password:group
# 例如: zhangsan:123456:developers

while IFS=':' read -r username password group; do
    if [ -z "$username" ]; then
        continue
    fi

    # 创建用户组(如果不存在)
    if [ -n "$group" ]; then
        groupadd $group 2>/dev/null
        useradd -m -g $group -s /bin/bash $username
    else
        useradd -m -s /bin/bash $username
    fi
    
    # 设置密码
    echo "$username:$password" | chpasswd
   
    echo "用户 $username 创建成功"
done < $USER_FILE

PART 06

定时任务配置

12. Crontab配置示例

将脚本加入定时任务实现自动化运维。

# 编辑crontab
crontab -e

# 配置示例
# 每天凌晨2点清理日志
0 2 * * * /opt/scripts/auto_clean_logs.sh

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

# 每5分钟检查磁盘使用率
*/5 * * * * /opt/scripts/disk_alert.sh

# 每周日凌晨4点系统健康检查
0 4 * * 0 /opt/scripts/health_check.sh > /var/log/health_weekly.log

# 每月1号清理缓存
0 5 1 * * /opt/scripts/clear_cache.sh

PART 07

应急运维脚本

13. 快速定位高CPU进程

#!/bin/bash
# top_cpu.sh - 快速定位高CPU消耗进程

echo "=== TOP 10 CPU消耗进程 ==="
ps aux --sort=-%cpu | head -11

14. 批量停止指定服务

#!/bin/bash
# stop_services.sh - 批量停止服务

services=("tomcat" "nginx" "redis")

for svc in "${services[@]}"; do
    systemctl stop $svc
    if [ $? -eq 0 ]; then
        echo "$svc 已停止"
    else
        echo "$svc 停止失败"
    fi
done

实用脚本技巧

  1. 添加执行权限chmod +x script.sh

  2. 调试模式bash -x script.sh 查看详细执行过程

  3. 日志记录./script.sh >> /var/log/script.log 2>&1

  4. 参数传递:使用 $1$2 接收命令行参数

  5. 错误处理:使用 set -e 遇错即停,set -u 未定义变量报错

掌握这些脚本,能让日常运维工作事半功倍。建议根据实际需求定制修改,逐步积累属于自己的脚本库。

图片

更多推荐