Linux运维常用脚本:提升效率的自动化利器
·
整理运维工作中最实用的自动化脚本,让重复工作一键完成。
在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
实用脚本技巧
-
添加执行权限:
chmod +x script.sh -
调试模式:
bash -x script.sh查看详细执行过程 -
日志记录:
./script.sh >> /var/log/script.log 2>&1 -
参数传递:使用
$1、$2接收命令行参数 -
错误处理:使用
set -e遇错即停,set -u未定义变量报错
掌握这些脚本,能让日常运维工作事半功倍。建议根据实际需求定制修改,逐步积累属于自己的脚本库。


更多推荐



所有评论(0)