Shell脚本自动化运维
让程序代替你敲重复的命令,有更多时间去思考人生哲理。本文将展示如何编写高效的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
最佳实践
编写高质量的运维脚本需要注意以下几点:
- 错误处理: 使用
set -e使脚本在错误时停止执行 - 用户输入验证: 检查参数和变量的有效性
- 日志记录: 记录脚本执行情况便于问题追踪
- 权限控制: 确保脚本在适当的权限下运行
- 定期测试: 定期在测试环境中验证脚本功能
安全注意事项
在编写运维脚本时,安全性是不可忽视的重要方面:
- 避免在脚本中硬编码敏感信息(如密码)
- 对用户输入进行适当的验证和过滤
- 使用绝对路径执行命令,避免PATH污染
- 设置适当的文件权限,避免未授权访问
- 定期审核脚本内容,移除不必要的功能
通过合理使用Shell脚本,可以显著提高运维工作效率,减少人为错误。从简单的日常任务开始,逐步构建自己的自动化工具集,是运维工程师成长的重要路径。