Linux运维自学坊

Linux运维自学坊

Shell脚本自动化运维

发布于 2023年4月10日 | 预计阅读时间 5 分钟

让程序代替你敲重复的命令,有更多时间去思考人生哲理。本文将展示如何编写高效的Shell脚本来完成日常运维任务,提高工作效率。

Shell脚本基础

Shell脚本是一种为Shell编写的脚本程序,可以自动化执行一系列命令。在Linux运维中,Shell脚本广泛应用于系统管理、备份、监控等场景。

一个基本的Shell脚本结构如下:

#!/bin/bash
# 这是一个示例脚本
# 脚本描述:显示当前系统信息

echo "系统信息报告 - $(date)"
echo "========================"
echo "当前用户: $(whoami)"
echo "当前时间: $(date)"
echo "主机名: $(hostname)"
echo "系统版本: $(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2)"
        
提示:脚本开头的#!/bin/bash称为Shebang,用于指定脚本解释器。

常用运维脚本示例

以下是一些实际工作中常用的运维脚本示例:

1. 系统备份脚本

#!/bin/bash
# 数据备份脚本

BACKUP_DIR="/backup"
SOURCE_DIR="/data"
DATE=$(date +%Y%m%d_%H%M%S)

# 创建备份目录
mkdir -p $BACKUP_DIR

# 执行备份
tar -czf $BACKUP_DIR/backup_$DATE.tar.gz $SOURCE_DIR

# 删除7天前的备份
find $BACKUP_DIR -name "backup_*.tar.gz" -mtime +7 -delete

echo "备份完成: backup_$DATE.tar.gz"
        

2. 服务监控脚本

#!/bin/bash
# 服务监控脚本

SERVICE="nginx"
LOG_FILE="/var/log/monitor.log"

# 检查服务状态
if ! systemctl is-active --quiet $SERVICE; then
    echo "$(date): $SERVICE is not running. Attempting restart..." >> $LOG_FILE
    
    # 尝试重启服务
    systemctl restart $SERVICE
    
    if systemctl is-active --quiet $SERVICE; then
        echo "$(date): $SERVICE restarted successfully." >> $LOG_FILE
    else
        echo "$(date): Failed to restart $SERVICE." >> $LOG_FILE
        # 发送告警邮件
        echo "Service $SERVICE failed to restart" | mail -s "Critical: Service Down" admin@example.com
    fi
else
    echo "$(date): $SERVICE is running normally." >> $LOG_FILE
fi
        

3. 磁盘清理脚本

#!/bin/bash
# 临时文件清理脚本

TEMP_DIRS=("/tmp" "/var/tmp")
LOG_FILE="/var/log/cleanup.log"

echo "$(date): 开始清理临时文件" >> $LOG_FILE

for dir in "${TEMP_DIRS[@]}"; do
    echo "清理目录: $dir" >> $LOG_FILE
    
    # 删除7天前的临时文件
    find $dir -type f -mtime +7 -delete
    
    # 删除空目录
    find $dir -type d -empty -delete
done

# 清理日志文件(保留最近30天)
find /var/log -name "*.log" -mtime +30 -delete

echo "$(date): 清理完成" >> $LOG_FILE
        

最佳实践

编写高质量的运维脚本需要注意以下几点:

安全注意事项

在编写运维脚本时,安全性是不可忽视的重要方面:

通过合理使用Shell脚本,可以显著提高运维工作效率,减少人为错误。从简单的日常任务开始,逐步构建自己的自动化工具集,是运维工程师成长的重要路径。