MedGemma-X镜像运维:logrotate自动轮转+磁盘空间预警脚本编写
MedGemma-X镜像运维:logrotate自动轮转+磁盘空间预警脚本编写
1. 引言:为什么需要自动化运维?
想象一下,你正在使用MedGemma-X分析一批重要的胸部X光片,系统突然卡住了。你检查后发现,日志文件已经膨胀到几十GB,把磁盘空间占满了。或者更糟的是,系统运行了几个月后,因为日志文件太大,导致应用崩溃,而你又没有及时发现。
这就是为什么我们需要自动化运维工具。MedGemma-X作为一个专业的AI影像诊断工具,在持续运行过程中会产生大量的日志数据。这些日志对于排查问题、监控系统健康至关重要,但如果管理不当,它们也会成为系统的负担。
本文将手把手教你为MedGemma-X镜像配置两套自动化运维工具:
- logrotate自动日志轮转- 自动管理日志文件大小和保留周期
- 磁盘空间预警脚本- 在磁盘空间不足时提前预警
即使你之前没有运维经验,跟着本文的步骤,也能轻松搞定这些配置。
2. 理解MedGemma-X的日志系统
在开始配置之前,我们先了解一下MedGemma-X的日志结构。根据提供的技术文档,MedGemma-X的主要日志文件位于:
/root/build/logs/gradio_app.log这个日志文件记录了:
- 应用启动和关闭信息
- 用户请求和响应
- 模型推理过程
- 系统错误和警告
- 资源使用情况
随着使用时间的增长,这个日志文件会越来越大。如果没有管理,可能会出现以下问题:
| 问题 | 可能的影响 | 解决方案 |
|---|---|---|
| 日志文件过大 | 占用大量磁盘空间,影响系统性能 | 定期轮转和清理 |
| 磁盘空间不足 | 应用无法写入新日志,可能导致崩溃 | 设置磁盘空间监控 |
| 历史日志丢失 | 无法追溯过去的问题 | 合理保留历史日志 |
| 查找困难 | 在大文件中查找特定信息效率低 | 按时间分割日志 |
理解了这些问题,我们就可以开始配置解决方案了。
3. 配置logrotate自动日志轮转
3.1 什么是logrotate?
logrotate是Linux系统自带的日志管理工具,它可以:
- 自动将大日志文件分割成小文件
- 压缩旧的日志文件节省空间
- 删除过期的日志文件
- 在轮转后重新创建日志文件
3.2 创建logrotate配置文件
首先,我们需要为MedGemma-X创建一个专门的logrotate配置文件:
# 创建配置文件 sudo nano /etc/logrotate.d/medgemma-x然后在文件中添加以下内容:
/root/build/logs/gradio_app.log { daily # 每天轮转一次 missingok # 如果日志文件不存在,不报错 notifempty # 如果日志文件为空,不轮转 compress # 压缩旧的日志文件 delaycompress # 延迟压缩,方便查看最近的日志 copytruncate # 复制后清空原文件,确保应用不中断 create 0644 root root # 创建新日志文件的权限和所有者 dateext # 使用日期作为后缀 dateformat -%Y%m%d # 日期格式:-20240123 rotate 30 # 保留30天的日志 maxsize 100M # 日志文件超过100MB立即轮转 postrotate # 如果需要,可以在这里添加轮转后执行的命令 # 例如:重新加载应用配置 endscript }让我解释一下关键配置项:
- daily:每天检查一次是否需要轮转
- maxsize 100M:即使没到一天,如果日志超过100MB也会立即轮转
- rotate 30:保留30个旧日志文件(大约一个月)
- compress:使用gzip压缩旧日志,节省约70%空间
- copytruncate:这是最重要的选项,它确保在轮转时应用不会中断
3.3 测试logrotate配置
配置完成后,我们先测试一下是否正常工作:
# 1. 先查看当前日志状态 ls -lh /root/build/logs/ # 2. 手动执行一次logrotate(测试模式) sudo logrotate -d /etc/logrotate.d/medgemma-x # 3. 如果测试正常,实际执行一次 sudo logrotate -f /etc/logrotate.d/medgemma-x # 4. 检查轮转结果 ls -lh /root/build/logs/你应该能看到类似这样的输出:
gradio_app.log # 新的空日志文件 gradio_app.log-20240123.gz # 压缩的旧日志3.4 验证自动执行
logrotate默认由cron每天自动执行一次。我们可以检查cron配置:
# 查看logrotate的cron任务 cat /etc/cron.daily/logrotate # 或者查看系统cron ls -la /etc/cron.daily/ | grep logrotate如果需要更频繁的检查(比如每小时),可以创建自定义的cron任务:
# 创建每小时检查的cron任务 sudo nano /etc/cron.hourly/medgemma-logrotate添加以下内容:
#!/bin/bash /usr/sbin/logrotate /etc/logrotate.d/medgemma-x然后给脚本执行权限:
sudo chmod +x /etc/cron.hourly/medgemma-logrotate4. 编写磁盘空间预警脚本
4.1 脚本设计思路
logrotate解决了日志文件过大的问题,但我们还需要监控整个磁盘的使用情况。磁盘空间预警脚本应该:
- 定期检查磁盘使用率
- 设置不同级别的预警阈值
- 提供清晰的预警信息
- 支持多种通知方式
- 自动清理临时文件
4.2 创建磁盘监控脚本
让我们创建一个完整的磁盘空间监控脚本:
# 创建脚本文件 sudo nano /root/build/scripts/disk_monitor.sh脚本内容如下:
#!/bin/bash # MedGemma-X 磁盘空间监控脚本 # 作者:系统管理员 # 版本:1.0 # 最后更新:2024-01-23 # 配置参数 THRESHOLD_WARNING=80 # 警告阈值:80%使用率 THRESHOLD_CRITICAL=90 # 严重阈值:90%使用率 THRESHOLD_EMERGENCY=95 # 紧急阈值:95%使用率 LOG_FILE="/root/build/logs/disk_monitor.log" CHECK_INTERVAL=3600 # 检查间隔(秒),默认1小时 # 磁盘路径(根据你的实际情况调整) DISK_PATH="/" MEDGEMMA_LOG_PATH="/root/build/logs/" MEDGEMMA_CACHE_PATH="/root/build/cache/" # 颜色定义(用于终端输出) RED='\033[0;31m' YELLOW='\033[1;33m' GREEN='\033[0;32m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 日志函数 log_message() { local level=$1 local message=$2 local timestamp=$(date '+%Y-%m-%d %H:%M:%S') echo "[$timestamp] [$level] $message" >> "$LOG_FILE" # 根据级别输出不同颜色 case $level in "EMERGENCY") echo -e "${RED}[$timestamp] [$level] $message${NC}" ;; "CRITICAL") echo -e "${RED}[$timestamp] [$level] $message${NC}" ;; "WARNING") echo -e "${YELLOW}[$timestamp] [$level] $message${NC}" ;; "INFO") echo -e "${GREEN}[$timestamp] [$level] $message${NC}" ;; *) echo "[$timestamp] [$level] $message" ;; esac } # 检查磁盘使用率 check_disk_usage() { local usage=$(df -h "$DISK_PATH" | awk 'NR==2 {print $5}' | sed 's/%//') local total=$(df -h "$DISK_PATH" | awk 'NR==2 {print $2}') local used=$(df -h "$DISK_PATH" | awk 'NR==2 {print $3}') local available=$(df -h "$DISK_PATH" | awk 'NR==2 {print $4}') echo "$usage $total $used $available" } # 清理临时文件 clean_temp_files() { log_message "INFO" "开始清理临时文件..." local freed_space=0 # 清理Docker临时文件(如果使用Docker) if command -v docker &> /dev/null; then log_message "INFO" "清理Docker系统资源..." docker system prune -f > /dev/null 2>&1 fi # 清理系统临时文件 log_message "INFO" "清理/tmp目录..." find /tmp -type f -mtime +7 -delete 2>/dev/null # 清理MedGemma缓存(谨慎操作) if [ -d "$MEDGEMMA_CACHE_PATH" ]; then log_message "INFO" "检查MedGemma缓存目录..." # 这里可以根据需要添加特定的清理逻辑 # 例如:find "$MEDGEMMA_CACHE_PATH" -name "*.tmp" -mtime +1 -delete fi # 清理日志备份(保留最近7天) if [ -d "$MEDGEMMA_LOG_PATH" ]; then log_message "INFO" "清理旧日志文件..." find "$MEDGEMMA_LOG_PATH" -name "*.log.*" -mtime +7 -delete 2>/dev/null find "$MEDGEMMA_LOG_PATH" -name "*.gz" -mtime +30 -delete 2>/dev/null fi log_message "INFO" "临时文件清理完成" } # 发送预警通知(示例函数,需要根据实际情况实现) send_alert() { local level=$1 local message=$2 local usage=$3 # 这里可以实现多种通知方式 # 1. 发送邮件 # 2. 发送Slack/钉钉消息 # 3. 调用Webhook # 4. 写入系统日志 # 示例:写入系统日志 logger -t "MedGemma-DiskMonitor" "[$level] $message - 当前使用率: $usage%" # 示例:在终端显示(实际使用时可以注释掉) log_message "$level" "预警通知: $message" # 如果需要邮件通知,可以这样配置: # echo "$message" | mail -s "MedGemma磁盘空间预警 [$level]" admin@example.com } # 主监控循环 monitor_loop() { log_message "INFO" "启动磁盘空间监控服务" log_message "INFO" "检查间隔: $CHECK_INTERVAL 秒" log_message "INFO" "监控路径: $DISK_PATH" while true; do # 检查磁盘使用率 read usage total used available <<< $(check_disk_usage) # 记录常规信息(每天记录一次) current_hour=$(date '+%H') if [ "$current_hour" = "00" ]; then log_message "INFO" "磁盘状态报告 - 总量: $total, 已用: $used, 可用: $available, 使用率: $usage%" fi # 检查阈值并触发相应操作 if [ "$usage" -ge "$THRESHOLD_EMERGENCY" ]; then # 紧急情况:使用率 >= 95% message="磁盘空间紧急告警!使用率已达 ${usage}%,可用空间仅剩 ${available}。系统可能随时崩溃,请立即处理!" send_alert "EMERGENCY" "$message" "$usage" clean_temp_files # 自动清理临时文件 elif [ "$usage" -ge "$THRESHOLD_CRITICAL" ]; then # 严重情况:使用率 >= 90% message="磁盘空间严重不足!使用率已达 ${usage}%,可用空间 ${available}。建议立即清理。" send_alert "CRITICAL" "$message" "$usage" elif [ "$usage" -ge "$THRESHOLD_WARNING" ]; then # 警告情况:使用率 >= 80% message="磁盘空间警告!使用率已达 ${usage}%,可用空间 ${available}。请注意监控。" send_alert "WARNING" "$message" "$usage" fi # 等待下一次检查 sleep "$CHECK_INTERVAL" done } # 生成磁盘使用报告 generate_report() { log_message "INFO" "生成磁盘使用详细报告..." echo "==========================================" echo " MedGemma-X 磁盘空间使用报告" echo " 生成时间: $(date)" echo "==========================================" echo "" # 总体磁盘使用情况 echo "【总体磁盘使用情况】" df -h "$DISK_PATH" echo "" # MedGemma相关目录大小 echo "【MedGemma-X 相关目录大小】" echo "日志目录 ($MEDGEMMA_LOG_PATH):" du -sh "$MEDGEMMA_LOG_PATH" 2>/dev/null || echo "目录不存在" echo "" if [ -d "$MEDGEMMA_CACHE_PATH" ]; then echo "缓存目录 ($MEDGEMMA_CACHE_PATH):" du -sh "$MEDGEMMA_CACHE_PATH" echo "" echo "缓存目录详细内容:" find "$MEDGEMMA_CACHE_PATH" -type f -exec du -h {} + 2>/dev/null | sort -hr | head -10 echo "" fi # 系统大文件查找 echo "【系统大文件(前10名)】" find / -type f -size +100M 2>/dev/null | head -10 echo "" # Docker磁盘使用(如果安装) if command -v docker &> /dev/null; then echo "【Docker磁盘使用】" docker system df echo "" fi echo "==========================================" echo "报告结束" } # 脚本主函数 main() { # 创建日志目录(如果不存在) mkdir -p "$(dirname "$LOG_FILE")" # 解析命令行参数 case "$1" in "start") log_message "INFO" "启动磁盘监控服务..." # 以后台方式运行 nohup bash "$0" daemon > /dev/null 2>&1 & echo "监控服务已启动,PID: $!" ;; "stop") log_message "INFO" "停止磁盘监控服务..." pkill -f "disk_monitor.sh daemon" echo "监控服务已停止" ;; "status") if pgrep -f "disk_monitor.sh daemon" > /dev/null; then echo "监控服务正在运行" ps aux | grep "disk_monitor.sh" | grep -v grep else echo "监控服务未运行" fi ;; "report") generate_report ;; "daemon") # 守护进程模式 monitor_loop ;; "test") # 测试模式 echo "测试磁盘监控脚本..." CHECK_INTERVAL=10 # 测试时缩短间隔 monitor_loop ;; *) echo "使用方法: $0 {start|stop|status|report|test}" echo "" echo "命令说明:" echo " start 启动监控服务" echo " stop 停止监控服务" echo " status 查看服务状态" echo " report 生成磁盘使用报告" echo " test 测试模式运行" exit 1 ;; esac } # 运行主函数 main "$@"4.3 配置脚本权限和测试
创建完脚本后,我们需要配置权限并测试:
# 1. 给脚本执行权限 sudo chmod +x /root/build/scripts/disk_monitor.sh # 2. 创建必要的目录 sudo mkdir -p /root/build/logs/ # 3. 测试脚本功能 # 生成报告 sudo /root/build/scripts/disk_monitor.sh report # 测试模式运行(Ctrl+C停止) sudo /root/build/scripts/disk_monitor.sh test # 4. 启动监控服务 sudo /root/build/scripts/disk_monitor.sh start # 5. 检查服务状态 sudo /root/build/scripts/disk_monitor.sh status # 6. 查看监控日志 tail -f /root/build/logs/disk_monitor.log4.4 配置开机自启动
为了让监控脚本在系统重启后自动运行,我们可以创建systemd服务:
# 创建systemd服务文件 sudo nano /etc/systemd/system/medgemma-disk-monitor.service添加以下内容:
[Unit] Description=MedGemma-X Disk Space Monitor After=network.target Wants=network.target [Service] Type=simple User=root ExecStart=/root/build/scripts/disk_monitor.sh start ExecStop=/root/build/scripts/disk_monitor.sh stop Restart=always RestartSec=10 [Install] WantedBy=multi-user.target然后启用服务:
# 重新加载systemd配置 sudo systemctl daemon-reload # 启用开机自启动 sudo systemctl enable medgemma-disk-monitor # 启动服务 sudo systemctl start medgemma-disk-monitor # 检查服务状态 sudo systemctl status medgemma-disk-monitor5. 高级配置与优化
5.1 配置邮件通知
如果你希望收到磁盘空间预警的邮件通知,可以配置邮件功能:
首先安装邮件发送工具:
# 安装mailutils(Ubuntu/Debian) sudo apt-get install mailutils -y # 或者安装sendmail(CentOS/RHEL) sudo yum install sendmail -y然后在disk_monitor.sh脚本的send_alert函数中添加邮件发送代码:
send_alert() { local level=$1 local message=$2 local usage=$3 # 邮件通知 local subject="[MedGemma-X 磁盘预警] $level - 使用率: $usage%" local recipient="your-email@example.com" # 修改为你的邮箱 echo "$message" | mail -s "$subject" "$recipient" # 原有的日志记录 logger -t "MedGemma-DiskMonitor" "[$level] $message - 当前使用率: $usage%" log_message "$level" "预警通知已发送到邮箱" }5.2 集成到现有监控系统
如果你已经有监控系统(如Prometheus、Zabbix等),可以将磁盘监控集成进去:
# 示例:创建Prometheus exporter sudo nano /root/build/scripts/disk_exporter.sh#!/bin/bash # Prometheus格式的磁盘指标导出 while true; do # 获取磁盘使用率 usage=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//') total=$(df -h / | awk 'NR==2 {print $2}' | sed 's/G//') used=$(df -h / | awk 'NR==2 {print $3}' | sed 's/G//') # 输出Prometheus格式的指标 cat << EOF # HELP medgemma_disk_usage_percent Disk usage percentage # TYPE medgemma_disk_usage_percent gauge medgemma_disk_usage_percent $usage # HELP medgemma_disk_total_gb Total disk space in GB # TYPE medgemma_disk_total_gb gauge medgemma_disk_total_gb $total # HELP medgemma_disk_used_gb Used disk space in GB # TYPE medgemma_disk_used_gb gauge medgemma_disk_used_gb $used EOF sleep 15 done5.3 配置日志分析
除了监控磁盘空间,我们还可以分析日志内容,提前发现问题:
# 创建日志分析脚本 sudo nano /root/build/scripts/log_analyzer.sh#!/bin/bash # MedGemma-X 日志分析脚本 LOG_FILE="/root/build/logs/gradio_app.log" REPORT_FILE="/root/build/logs/analysis_report_$(date +%Y%m%d).txt" analyze_logs() { echo "MedGemma-X 日志分析报告" > "$REPORT_FILE" echo "生成时间: $(date)" >> "$REPORT_FILE" echo "======================================" >> "$REPORT_FILE" # 分析错误和警告 echo "【错误统计】" >> "$REPORT_FILE" grep -i "error\|failed\|exception" "$LOG_FILE" | tail -20 >> "$REPORT_FILE" echo "" >> "$REPORT_FILE" echo "【警告统计】" >> "$REPORT_FILE" grep -i "warning" "$LOG_FILE" | tail -10 >> "$REPORT_FILE" echo "" >> "$REPORT_FILE" # 分析请求频率 echo "【请求统计】" >> "$REPORT_FILE" echo "最近100条请求的时间分布:" >> "$REPORT_FILE" grep "Request received" "$LOG_FILE" | tail -100 | awk '{print $1, $2}' | uniq -c >> "$REPORT_FILE" echo "" >> "$REPORT_FILE" # 分析响应时间 echo "【性能统计】" >> "$REPORT_FILE" grep "Request completed" "$LOG_FILE" | tail -20 | awk -F 'in' '{print $2}' | sort -n >> "$REPORT_FILE" echo "分析完成,报告保存至: $REPORT_FILE" } # 每天凌晨执行分析 if [ "$1" = "daily" ]; then analyze_logs # 可以在这里添加邮件发送功能 # mail -s "MedGemma日志分析报告" admin@example.com < "$REPORT_FILE" fi6. 总结
通过本文的配置,我们为MedGemma-X镜像建立了一套完整的自动化运维体系:
6.1 已实现的自动化功能
日志自动管理
- 每日自动轮转日志文件
- 自动压缩旧日志节省空间
- 保留30天历史日志供审计
- 单个日志文件不超过100MB
磁盘空间智能监控
- 实时监控磁盘使用率
- 三级预警机制(警告/严重/紧急)
- 自动清理临时文件
- 支持邮件通知
- 开机自启动
运维便利性提升
- 一键生成磁盘使用报告
- 完整的服务管理命令
- 详细的日志记录
- 易于扩展的架构
6.2 日常运维建议
- 定期检查:每周查看一次磁盘监控日志
- 报告分析:每月生成一次完整的磁盘使用报告
- 容量规划:根据使用情况提前规划磁盘扩容
- 备份策略:重要日志定期备份到其他存储
6.3 故障排查快速指南
如果遇到磁盘相关问题,可以按以下步骤排查:
# 1. 检查当前磁盘状态 df -h / # 2. 查看监控服务状态 sudo systemctl status medgemma-disk-monitor # 3. 查看监控日志 tail -f /root/build/logs/disk_monitor.log # 4. 手动清理空间 sudo /root/build/scripts/disk_monitor.sh report # 根据报告清理不需要的文件 # 5. 重启监控服务 sudo systemctl restart medgemma-disk-monitor6.4 后续优化方向
根据实际使用情况,你还可以考虑以下优化:
- 集成到现有监控平台:将指标推送到Prometheus、Grafana等
- 云服务集成:如果使用云服务器,可以集成云监控服务
- 自动化扩容:当磁盘空间不足时自动扩容(云环境)
- 日志分析增强:使用ELK栈进行更深入的日志分析
- 多节点监控:如果部署了多个MedGemma实例,可以集中监控
通过这套自动化运维方案,你可以确保MedGemma-X系统长期稳定运行,专注于医疗影像分析的核心工作,而不用担心运维问题。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
