场景描述
你负责一个Web应用的运维工作,该应用部署在一组Linux服务器上。你需要编写一个Shell脚本来自动化以下任务:
检查Web服务器进程: 确保Web服务器(例如Apache或Nginx)正常运行。如果没有运行,则尝试重启服务。
监控磁盘空间: 检查应用服务器的根分区磁盘空间使用情况,如果使用超过85%,则发送警报。
备份日志文件: 将/var/log目录下的日志文件压缩并移动到备份目录,同时保留最近7天的日志。
系统健康报告: 生成一个包含服务器的CPU使用率、内存使用情况、磁盘空间和当前运行的Web服务器进程数量的报告。
Shell脚本需求
健壮性: 脚本在执行各项任务时应检查潜在的错误,例如磁盘空间不足、服务无法启动等,并相应地处理这些错误。
通知机制: 当发现重要问题(如服务停止、磁盘空间过高)时,脚本应发送通知到预设的管理员邮箱或通过其他通讯工具。
日志记录: 脚本执行的所有操作都应该有日志记录,便于事后审计和故障排查。
定时执行: 该脚本应配置为定时任务,例如每天执行一次。
这个脚本不仅可以帮助自动化日常运维任务,提高工作效率,还能及时发现并处理潜在的问题,避免可能的服务中断。
#初版脚本:
#!/bin/bash
# 配置部分
web_service='nginx' # 你的Web服务名称,比如apache或nginx
backup_dir='/path/to/backup' # 日志备份目录
admin_email='admin@example.com' # 管理员邮箱
# 发送通知
send_notification() {
subject=$1
message=$2
# 使用mail命令发送邮件,也可以替换成其他通知方式
echo "$message" | mail -s "$subject" $admin_email
}
# 检查Web服务
check_web_service() {
if systemctl is-active --quiet $web_service; then
echo "Web服务正在运行"
else
echo "Web服务未运行,尝试启动..."
systemctl start $web_service
if [ $? -ne 0 ]; then
send_notification "Web服务启动失败" "尝试启动$web_service失败,请立即检查!"
fi
fi
}
# 监控磁盘空间
monitor_disk_space() {
usage=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $usage -ge 85 ]; then
send_notification "磁盘空间警告" "根分区磁盘使用率已达$usage%,请及时清理。"
fi
}
# 备份日志文件
backup_logs() {
tar czf $backup_dir/log-$(date +%Y%m%d).tar.gz /var/log
find $backup_dir -type f -name 'log-*.tar.gz' -mtime +7 -exec rm {} \;
}
# 系统健康报告
system_health_report() {
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
mem_usage=$(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2 }')
disk_usage=$(df -h / | awk 'NR==2 {print $5}')
web_proc_count=$(ps -ef | grep $web_service | grep -v grep | wc -l)
echo "系统健康报告:"
echo "CPU使用率: $cpu_usage%"
echo "内存使用率: $mem_usage"
echo "磁盘使用率: $disk_usage"
echo "Web服务进程数量: $web_proc_count"
}
# 主执行函数
main() {
check_web_service
monitor_disk_space
backup_logs
system_health_report
}
# 调用主函数
main
# 日志记录(可按需调整)
echo "脚本执行完成: $(date)" >> /var/log/maintenance_script.log