
整理运维工作中最实用的自动化脚本,让重复工作一键完成。
在Linux运维工作中,善用脚本可以极大提升效率。本文整理了运维工作中最常用的脚本示例,覆盖日志清理、备份、监控、系统检查等场景,拿来即用。
日志文件占用过多磁盘空间是常见问题,通过脚本自动清理可有效避免。
#!/bin/bash# auto_clean_logs.sh - 清理指定目录下N天前的日志文件LOG_DIR="/var/log/myapp"DAYS=30find $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
将7天前的日志压缩归档,节省空间的同时保留历史数据。
#!/bin/bash# archive_logs.sh - 压缩归档7天前的日志LOG_DIR="/var/log/myapp"ARCHIVE_DIR="/backup/logs"DAYS=7mkdir -p $ARCHIVE_DIRfind $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
#!/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=7mkdir -p $BACKUP_DIRmysqldump -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 -deleteecho "$(date): MySQL backup completed: ${DB_NAME}_${DATE}.sql.gz"
使用rsync实现增量备份,高效且节省空间。
#!/bin/bash# rsync_backup.sh - 使用rsync进行增量备份SOURCE_DIR="/data/"BACKUP_DIR="/backup/data/"EXCLUDE_FILE="/backup/exclude.list"# 排除文件列表示例# *.tmp# cache/# logs/*.logrsync -avz --delete --exclude-from=$EXCLUDE_FILE $SOURCE_DIR $BACKUP_DIRecho "$(date): Rsync backup completed" >> /var/log/backup.log
#!/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 udevecho ""# 系统运行时间echo "--- 系统运行时间 ---"uptime -pecho ""# 最近登录echo "--- 最近登录用户 ---"last -n 5 | grep -v "^$"echo ""# 检查关键服务echo "--- 关键服务状态 ---"services=("nginx" "mysql" "ssh")for svc in "${services[@]}"; doif systemctl is-active --quiet $svc; thenecho "$svc: ✓ 运行中"elseecho "$svc: ✗ 已停止"fidone
#!/bin/bash# disk_alert.sh - 磁盘空间告警THRESHOLD=80EMAIL="admin@example.com"WARN_FILE="/tmp/disk_warn.txt"df -h | grep -v tmpfs | grep -v udev | while read line; dousage=$(echo $line | awk '{print $5}' | sed 's/%//')mount=$(echo $line | awk '{print $6}')if [ $usage -gt $THRESHOLD ]; thenecho "警告: 分区 $mount 使用率已达 $usage% (阈值: $THRESHOLD%)" >> $WARN_FILEfidoneif [ -s $WARN_FILE ]; thencat $WARN_FILE | mail -s "磁盘空间告警" $EMAILrm -f $WARN_FILEfi
#!/bin/bash# port_check.sh - 检查服务端口是否正常HOST="localhost"PORTS=("80" "443" "3306" "6379")for port in "${PORTS[@]}"; donc -zv $HOST $port &> /dev/nullif [ $? -eq 0 ]; thenecho "✓ 端口 $port 正常"elseecho "✗ 端口 $port 异常"fidone
#!/bin/bash# clear_cache.sh - 清理系统内存缓存# 同步磁盘数据sync# 清理页缓存、目录项和inodeecho 3 > /proc/sys/vm/drop_cachesecho "$(date): System cache cleared" >> /var/log/cache_clean.log
#!/bin/bash# fix_permissions.sh - 批量修复文件权限WEB_DIR="/var/www/html"# 目录755,文件644find $WEB_DIR -type d -exec chmod 755 {} \;find $WEB_DIR -type f -exec chmod 644 {} \;# 特定目录开放写入权限chmod 775 $WEB_DIR/uploadschmod 775 $WEB_DIR/cacheecho "$(date): Permissions fixed for $WEB_DIR"
#!/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_FILEecho "查找到以下大文件,请确认后删除:"cat $LOG_FILE# 如需自动删除,取消下面注释(慎用!)# find $SEARCH_DIR -type f -size $SIZE -exec rm -f {} \;
#!/bin/bash# batch_create_users.sh - 批量创建用户USER_FILE="user_list.txt"# user_list.txt 格式: username:password:group# 例如: zhangsan:123456:developerswhile IFS=':' read -r username password group; doif [ -z "$username" ]; thencontinuefi# 创建用户组(如果不存在)if [ -n "$group" ]; thengroupadd $group 2>/dev/nulluseradd -m -g $group -s /bin/bash $usernameelseuseradd -m -s /bin/bash $usernamefi# 设置密码echo "$username:$password" | chpasswdecho "用户 $username 创建成功"done < $USER_FILE
将脚本加入定时任务实现自动化运维。
# 编辑crontabcrontab -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
#!/bin/bash# top_cpu.sh - 快速定位高CPU消耗进程echo "=== TOP 10 CPU消耗进程 ==="ps aux --sort=-%cpu | head -11
#!/bin/bash# stop_services.sh - 批量停止服务services=("tomcat" "nginx" "redis")for svc in "${services[@]}"; dosystemctl stop $svcif [ $? -eq 0 ]; thenecho "$svc 已停止"elseecho "$svc 停止失败"fidone
添加执行权限:chmod +x script.sh
调试模式:bash -x script.sh 查看详细执行过程
日志记录:./script.sh >> /var/log/script.log 2>&1
参数传递:使用 $1、$2 接收命令行参数
错误处理:使用 set -e 遇错即停,set -u 未定义变量报错
掌握这些脚本,能让日常运维工作事半功倍。建议根据实际需求定制修改,逐步积累属于自己的脚本库。


认准红帽官方授权
微思-红帽官方授权合作伙伴!

— Linux文章推荐 —
