Ostrakon-VL-8B系统资源监控与C盘清理自动化脚本1. 引言如果你在Windows服务器上跑过Ostrakon-VL-8B这类大模型肯定遇到过这样的头疼事模型跑得好好的突然就报错了一看日志要么是C盘空间不足要么是显存爆了。特别是C盘日志文件、临时数据、缓存文件不知不觉就占满了手动清理又麻烦又容易误删重要文件。更让人心烦的是这些问题往往在你最忙的时候出现——可能是深夜处理批量任务也可能是线上服务高峰期。这时候手忙脚乱地去清理磁盘、重启服务不仅影响工作进度还可能造成数据丢失。今天我就分享一套自己用了很久的自动化监控脚本。它能帮你实时盯着服务器的GPU显存、磁盘空间特别是C盘还有服务运行状态。一旦C盘空间低于你设定的安全线脚本就会自动触发清理任务——不是乱删而是智能地归档旧日志、清理临时文件确保你的Ostrakon-VL-8B服务能长期稳定运行。这套脚本最大的好处就是省心。你只需要一次性设置好它就会在后台默默工作发现问题自动处理让你能更专注于模型本身的应用和优化。2. 脚本环境准备与快速部署2.1 系统要求与工具准备这套脚本主要针对Windows服务器环境特别是那些跑AI模型服务的机器。在开始之前你需要确认几个基础条件操作系统Windows Server 2016及以上版本或者Windows 10/11的专业版/企业版。家庭版可能缺少一些管理工具。Python环境需要Python 3.7或更高版本。脚本用到了几个标准库一般Python安装都自带。权限要求运行脚本的账户需要有管理员权限这样才能获取系统资源信息和执行清理操作。基础工具系统自带的PowerShell5.1或更高版本就能用不需要额外安装。如果你不确定自己的环境可以打开PowerShell分别运行下面两个命令检查# 检查Python版本 python --version # 检查PowerShell版本 $PSVersionTable.PSVersion看到版本号输出就说明环境没问题。2.2 脚本文件结构与部署整套脚本包含三个核心文件分工明确monitor_resources.py- 资源监控主脚本cleanup_c_drive.py- C盘清理专用脚本run_monitor.bat- 一键启动的批处理文件我建议你在服务器上创建一个专门目录来存放这些脚本比如C:\AI_Service_Monitor。这样管理起来方便也不会和别的文件混在一起。首先创建这个目录# 在PowerShell中创建目录 New-Item -ItemType Directory -Path C:\AI_Service_Monitor -Force然后你可以直接复制我下面提供的脚本代码在对应的目录里创建这三个文件。或者如果你习惯用git也可以把脚本仓库克隆到本地。3. 资源监控脚本详解3.1 监控脚本核心功能monitor_resources.py是这个自动化系统的眼睛它负责持续检查服务器的各项关键指标。主要监控三个方面GPU显存使用情况Ostrakon-VL-8B运行时很吃显存显存不足会导致模型加载失败或推理中断。磁盘空间重点C盘日志文件、临时数据、模型缓存都会写在C盘空间不足是服务中断最常见的原因。模型服务进程状态检查Ostrakon-VL-8B的服务是否在正常运行有没有意外崩溃。脚本会定期默认每5分钟检查一次把结果记录到日志文件同时如果发现异常比如C盘空间低于阈值就会自动调用清理脚本。3.2 监控脚本完整代码与解析下面是完整的监控脚本代码我加了详细注释方便你理解每一部分的作用#!/usr/bin/env python3 Ostrakon-VL-8B 系统资源监控脚本 监控GPU显存、磁盘空间、服务状态自动触发清理任务 import psutil import subprocess import json import time import logging import os from datetime import datetime import sys # 配置日志系统 logging.basicConfig( levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(C:\\AI_Service_Monitor\\monitor.log), logging.StreamHandler() ] ) logger logging.getLogger(__name__) class SystemMonitor: def __init__(self): # 监控配置 self.check_interval 300 # 检查间隔单位秒5分钟 self.c_drive_threshold 10 # C盘空间告警阈值单位GB self.gpu_memory_threshold 90 # GPU显存使用率告警阈值单位% # 服务进程名称根据你的实际服务名称修改 self.service_process_names [python, ostrakon, vl_service] # 清理脚本路径 self.cleanup_script C:\\AI_Service_Monitor\\cleanup_c_drive.py def get_disk_usage(self): 获取所有磁盘分区的使用情况 disk_info {} for partition in psutil.disk_partitions(): try: usage psutil.disk_usage(partition.mountpoint) disk_info[partition.mountpoint] { total_gb: round(usage.total / (1024**3), 2), used_gb: round(usage.used / (1024**3), 2), free_gb: round(usage.free / (1024**3), 2), percent: usage.percent } except Exception as e: logger.warning(f无法获取分区 {partition.mountpoint} 信息: {e}) return disk_info def get_gpu_memory(self): 获取GPU显存使用情况需要NVIDIA GPU try: # 使用nvidia-smi命令获取GPU信息 result subprocess.run( [nvidia-smi, --query-gpumemory.total,memory.used, --formatcsv,noheader,nounits], capture_outputTrue, textTrue, encodingutf-8 ) if result.returncode 0: gpu_info [] for line in result.stdout.strip().split(\n): if line: total, used map(int, line.split(,)) percent (used / total) * 100 if total 0 else 0 gpu_info.append({ total_mb: total, used_mb: used, usage_percent: round(percent, 1) }) return gpu_info else: logger.warning(nvidia-smi命令执行失败可能未安装或GPU不可用) return None except FileNotFoundError: logger.warning(未找到nvidia-smi命令跳过GPU监控) return None except Exception as e: logger.error(f获取GPU信息时出错: {e}) return None def check_service_status(self): 检查Ostrakon-VL-8B相关服务是否在运行 running_services [] for proc in psutil.process_iter([pid, name, cmdline]): try: process_info proc.info cmdline .join(process_info[cmdline]) if process_info[cmdline] else # 检查进程名或命令行是否包含服务关键词 for service_name in self.service_process_names: if (service_name.lower() in process_info[name].lower() or service_name.lower() in cmdline.lower()): running_services.append({ pid: process_info[pid], name: process_info[name], cmdline: cmdline[:100] # 只取前100字符 }) break except (psutil.NoSuchProcess, psutil.AccessDenied): continue return running_services def check_c_drive_space(self, disk_info): 检查C盘空间是否低于阈值 c_drive disk_info.get(C:\\) if not c_drive: logger.error(未找到C盘信息) return False, None free_gb c_drive[free_gb] if free_gb self.c_drive_threshold: logger.warning(fC盘空间不足剩余 {free_gb}GB低于阈值 {self.c_drive_threshold}GB) return True, free_gb else: logger.info(fC盘空间正常剩余 {free_gb}GB) return False, free_gb def trigger_cleanup(self): 触发C盘清理脚本 if os.path.exists(self.cleanup_script): try: logger.info(C盘空间不足触发自动清理...) result subprocess.run( [python, self.cleanup_script], capture_outputTrue, textTrue, encodingutf-8 ) if result.returncode 0: logger.info(f清理脚本执行成功: {result.stdout}) else: logger.error(f清理脚本执行失败: {result.stderr}) return result.returncode 0 except Exception as e: logger.error(f执行清理脚本时出错: {e}) return False else: logger.error(f清理脚本不存在: {self.cleanup_script}) return False def run_monitoring_cycle(self): 执行一次完整的监控检查 logger.info( * 50) logger.info(f开始监控检查 - {datetime.now().strftime(%Y-%m-%d %H:%M:%S)}) # 1. 检查磁盘空间 disk_info self.get_disk_usage() logger.info(磁盘使用情况:) for drive, info in disk_info.items(): logger.info(f {drive}: 总共{info[total_gb]}GB, 已用{info[used_gb]}GB, f剩余{info[free_gb]}GB ({info[percent]}%)) # 2. 检查C盘空间触发清理 c_drive_warning, free_space self.check_c_drive_space(disk_info) if c_drive_warning: self.trigger_cleanup() # 3. 检查GPU显存 gpu_info self.get_gpu_memory() if gpu_info: logger.info(GPU显存使用情况:) for i, gpu in enumerate(gpu_info): status ⚠️ 警告 if gpu[usage_percent] self.gpu_memory_threshold else 正常 logger.info(f GPU{i}: 总共{gpu[total_mb]}MB, f已用{gpu[used_mb]}MB ({gpu[usage_percent]}%) - {status}) # 4. 检查服务状态 services self.check_service_status() if services: logger.info(f发现 {len(services)} 个相关服务在运行:) for service in services: logger.info(f PID {service[pid]}: {service[name]}) else: logger.warning(未发现Ostrakon-VL-8B相关服务在运行) logger.info(f监控检查完成{self.check_interval}秒后再次检查) logger.info( * 50) def run_continuously(self): 持续运行监控 logger.info(启动Ostrakon-VL-8B系统资源监控) logger.info(f检查间隔: {self.check_interval}秒) logger.info(fC盘告警阈值: {self.c_drive_threshold}GB) logger.info(fGPU显存告警阈值: {self.gpu_memory_threshold}%) try: while True: self.run_monitoring_cycle() time.sleep(self.check_interval) except KeyboardInterrupt: logger.info(监控被用户中断) except Exception as e: logger.error(f监控运行出错: {e}) sys.exit(1) if __name__ __main__: monitor SystemMonitor() monitor.run_continuously()这个脚本的设计有几个关键点值得注意模块化设计每个功能都有独立的方法方便你后续修改或扩展。容错处理比如获取GPU信息时如果机器没有NVIDIA显卡或者没装驱动脚本会给出警告而不是直接崩溃。详细日志所有操作和状态都会记录到日志文件方便事后排查问题。可配置参数检查间隔、告警阈值都可以在代码开头轻松修改。3.3 一键启动批处理文件为了让监控脚本能在后台持续运行我准备了一个简单的批处理文件echo off REM Ostrakon-VL-8B 监控脚本启动器 REM 作者AI服务监控工具 REM 日期2024年 echo 正在启动Ostrakon-VL-8B系统资源监控... echo 监控日志将保存到 C:\AI_Service_Monitor\monitor.log REM 切换到脚本目录 cd /d C:\AI_Service_Monitor REM 检查Python是否可用 python --version nul 21 if errorlevel 1 ( echo 错误未找到Python请先安装Python 3.7或更高版本 pause exit /b 1 ) REM 检查监控脚本是否存在 if not exist monitor_resources.py ( echo 错误未找到监控脚本 monitor_resources.py pause exit /b 1 ) echo 启动监控脚本按CtrlC停止... echo. REM 运行监控脚本 python monitor_resources.py REM 脚本结束后暂停方便查看错误信息 echo. echo 监控脚本已停止 pause这个批处理文件做了几件事检查Python环境、检查脚本文件、然后启动监控。你只需要双击run_monitor.bat监控就开始了。4. C盘智能清理脚本详解4.1 清理策略与安全考虑C盘清理是个需要小心操作的事情不能随便删文件。我的清理脚本遵循几个原则安全第一只清理明确可以清理的文件类型比如日志、临时文件、缓存。归档优先重要的日志文件先压缩归档再删除原文件保留历史记录。保留近期文件最近的文件不删避免影响正在运行的服务。可配置清理哪些目录、保留多少天的文件都可以灵活配置。脚本主要清理以下几类文件应用日志文件Ostrakon-VL-8B运行产生的日志保留最近7天旧的归档后删除。系统临时文件Windows临时目录清理超过30天的文件。用户临时文件当前用户的Temp目录。软件缓存常见AI工具和浏览器的缓存文件。4.2 清理脚本完整代码与解析下面是清理脚本的完整代码同样加了详细注释#!/usr/bin/env python3 C盘智能清理脚本 安全清理日志、临时文件、缓存自动归档重要日志 import os import shutil import zipfile import time from datetime import datetime, timedelta import logging import json # 配置日志 logging.basicConfig( levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(C:\\AI_Service_Monitor\\cleanup.log), logging.StreamHandler() ] ) logger logging.getLogger(__name__) class CDriveCleaner: def __init__(self): # 清理配置 self.keep_days 7 # 保留最近多少天的日志文件 self.archive_days 30 # 归档多少天前的日志 self.max_temp_age_days 30 # 临时文件最大保留天数 # 要清理的目录和文件模式 self.cleanup_targets [ { path: C:\\AI_Service_Logs, patterns: [*.log, *.txt], action: archive_then_delete, # 先归档再删除 description: AI服务日志目录 }, { path: os.environ.get(TEMP, C:\\Windows\\Temp), patterns: [*], action: delete_old, description: 系统临时目录, exclude_dirs: [正在使用] # 排除可能正在使用的目录 }, { path: os.path.join(os.environ.get(USERPROFILE, ), AppData, Local, Temp), patterns: [*], action: delete_old, description: 用户临时目录 }, { path: C:\\Users\\Public\\Documents\\AI_Cache, patterns: [*.cache, *.tmp], action: delete_all, description: AI模型缓存 } ] # 归档目录 self.archive_base C:\\AI_Service_Archives # 统计信息 self.stats { total_freed: 0, # 总共释放空间字节 files_deleted: 0, files_archived: 0, errors: 0 } def get_file_age_days(self, filepath): 获取文件最后修改时间天数 try: mtime os.path.getmtime(filepath) file_time datetime.fromtimestamp(mtime) now datetime.now() age (now - file_time).days return age except Exception as e: logger.warning(f无法获取文件年龄 {filepath}: {e}) return 0 def safe_delete_file(self, filepath, reason): 安全删除文件记录统计 try: if os.path.isfile(filepath): file_size os.path.getsize(filepath) os.remove(filepath) self.stats[total_freed] file_size self.stats[files_deleted] 1 log_msg f删除文件: {filepath} ({file_size:,} 字节) if reason: log_msg f - {reason} logger.info(log_msg) return True else: logger.warning(f文件不存在或不是文件: {filepath}) return False except PermissionError: logger.warning(f无权限删除文件可能正在使用: {filepath}) return False except Exception as e: logger.error(f删除文件失败 {filepath}: {e}) self.stats[errors] 1 return False def archive_files(self, filepaths, archive_name): 将文件打包为ZIP归档 archive_dir os.path.join(self.archive_base, datetime.now().strftime(%Y-%m)) os.makedirs(archive_dir, exist_okTrue) archive_path os.path.join(archive_dir, f{archive_name}.zip) try: with zipfile.ZipFile(archive_path, a, zipfile.ZIP_DEFLATED) as zipf: archived_count 0 for filepath in filepaths: if os.path.exists(filepath): # 在ZIP中保存相对路径结构 arcname os.path.basename(filepath) zipf.write(filepath, arcname) archived_count 1 if archived_count 0: self.stats[files_archived] archived_count logger.info(f已归档 {archived_count} 个文件到 {archive_path}) return archive_path else: logger.warning(没有文件需要归档) return None except Exception as e: logger.error(f创建归档失败: {e}) self.stats[errors] 1 return None def process_directory(self, target): 处理一个目录的清理任务 path target[path] patterns target[patterns] action target[action] description target[description] if not os.path.exists(path): logger.warning(f目录不存在跳过: {path} ({description})) return logger.info(f处理目录: {path} ({description})) files_to_archive [] files_to_delete [] # 收集所有匹配的文件 for pattern in patterns: import glob matched_files glob.glob(os.path.join(path, **, pattern), recursiveTrue) for filepath in matched_files: # 跳过排除的目录 skip False for exclude in target.get(exclude_dirs, []): if exclude in filepath: skip True break if skip: continue age_days self.get_file_age_days(filepath) if action archive_then_delete: if age_days self.archive_days: files_to_delete.append(filepath) elif age_days self.keep_days: files_to_archive.append(filepath) elif action delete_old: if age_days self.max_temp_age_days: files_to_delete.append(filepath) elif action delete_all: files_to_delete.append(filepath) # 执行归档 if files_to_archive: archive_name f{description}_{datetime.now().strftime(%Y%m%d_%H%M%S)} self.archive_files(files_to_archive, archive_name) # 执行删除 for filepath in files_to_delete: reason if action archive_then_delete: reason f超过归档期限 ({self.archive_days}天) elif action delete_old: reason f超过保留期限 ({self.max_temp_age_days}天) self.safe_delete_file(filepath, reason) def cleanup_windows_temp(self): 专门清理Windows临时目录 temp_paths [ C:\\Windows\\Temp\\*, C:\\Windows\\Logs\\*, os.path.join(os.environ.get(WINDIR, C:\\Windows), SoftwareDistribution\\Download\\*) ] for temp_pattern in temp_paths: import glob temp_files glob.glob(temp_pattern) for filepath in temp_files: try: age_days self.get_file_age_days(filepath) if age_days 7: # Windows临时文件保留7天 if os.path.isfile(filepath): self.safe_delete_file(filepath, Windows临时文件) elif os.path.isdir(filepath): # 尝试删除空目录 try: os.rmdir(filepath) logger.info(f删除空目录: {filepath}) except: pass # 目录非空跳过 except Exception as e: logger.warning(f处理Windows临时文件失败 {filepath}: {e}) def run_cleanup(self): 执行完整的清理流程 logger.info( * 60) logger.info(f开始C盘清理 - {datetime.now().strftime(%Y-%m-%d %H:%M:%S)}) logger.info(f保留最近 {self.keep_days} 天的日志) logger.info(f归档 {self.archive_days} 天前的日志) logger.info(f清理超过 {self.max_temp_age_days} 天的临时文件) logger.info( * 60) start_time time.time() # 创建归档目录 os.makedirs(self.archive_base, exist_okTrue) # 处理所有目标目录 for target in self.cleanup_targets: self.process_directory(target) # 额外清理Windows临时文件 self.cleanup_windows_temp() # 计算并显示统计信息 end_time time.time() duration end_time - start_time freed_gb self.stats[total_freed] / (1024**3) logger.info( * 60) logger.info(清理完成统计:) logger.info(f 释放空间: {freed_gb:.2f} GB) logger.info(f 删除文件: {self.stats[files_deleted]} 个) logger.info(f 归档文件: {self.stats[files_archived]} 个) logger.info(f 错误数量: {self.stats[errors]} 个) logger.info(f 耗时: {duration:.1f} 秒) logger.info( * 60) # 返回清理结果 return { freed_gb: freed_gb, files_deleted: self.stats[files_deleted], files_archived: self.stats[files_archived], errors: self.stats[errors], duration_seconds: duration } if __name__ __main__: cleaner CDriveCleaner() result cleaner.run_cleanup() # 将结果保存为JSON方便监控脚本读取 result_file C:\\AI_Service_Monitor\\last_cleanup.json with open(result_file, w, encodingutf-8) as f: json.dump(result, f, indent2) logger.info(f清理结果已保存到: {result_file})这个清理脚本有几个实用的设计分级清理策略不同目录用不同的清理策略重要日志先归档再删除临时文件直接删除。安全防护删除前检查文件年龄排除可能正在使用的文件。完整日志每个操作都有记录方便追踪和审计。统计报告清理完成后显示详细的统计信息。4.3 清理脚本的配置调整你可能需要根据自己服务器的实际情况调整清理配置。主要修改__init__方法里的这几个参数# 在 CDriveCleaner 类的 __init__ 方法中修改这些值 # 保留最近多少天的日志文件不删除 self.keep_days 7 # 归档多少天前的日志超过这个天数的删除7-30天之间的归档 self.archive_days 30 # 临时文件最大保留天数 self.max_temp_age_days 30 # 清理目标目录 - 根据你的实际目录调整 self.cleanup_targets [ { path: C:\\你的日志目录, # 修改为你的实际日志目录 patterns: [*.log, *.txt], action: archive_then_delete, description: 你的服务日志 }, # ... 其他目录 ]如果你不知道日志文件在哪里可以先运行Ostrakon-VL-8B服务然后在任务管理器中找到对应的进程右键打开文件位置就能找到日志目录了。5. 监控系统的部署与使用5.1 完整部署步骤现在我们把所有脚本整合起来完成整个监控系统的部署创建监控目录mkdir C:\AI_Service_Monitor cd C:\AI_Service_Monitor创建监控脚本用文本编辑器创建monitor_resources.py复制上面的监控脚本代码保存。创建清理脚本创建cleanup_c_drive.py复制上面的清理脚本代码保存。创建启动脚本创建run_monitor.bat复制上面的批处理代码保存。安装Python依赖监控脚本只需要psutil这个库如果还没安装运行pip install psutil测试脚本先手动运行一次清理脚本检查是否有权限问题python cleanup_c_drive.py然后测试监控脚本python monitor_resources.py按CtrlC停止测试。配置为计划任务可选如果你希望监控脚本开机自启动可以配置为Windows计划任务打开任务计划程序创建基本任务触发器设为计算机启动时操作为启动程序程序填C:\AI_Service_Monitor\run_monitor.bat勾选不管用户是否登录都要运行5.2 日常使用与维护部署完成后日常使用非常简单启动监控双击run_monitor.bat或者如果配置了计划任务重启电脑后会自动启动。查看日志监控日志在C:\AI_Service_Monitor\monitor.log清理日志在cleanup.log。查看清理结果每次清理的统计信息会保存到last_cleanup.json。归档文件归档的日志ZIP文件在C:\AI_Service_Archives目录下按年月组织。监控脚本运行后你会在日志中看到类似这样的输出2024-01-15 10:00:00 - INFO - 开始监控检查 - 2024-01-15 10:00:00 2024-01-15 10:00:00 - INFO - 磁盘使用情况: 2024-01-15 10:00:00 - INFO - C:\: 总共237GB, 已用210GB, 剩余27GB (88%) 2024-01-15 10:00:00 - INFO - D:\: 总共931GB, 已用320GB, 剩余611GB (34%) 2024-01-15 10:00:00 - INFO - C盘空间正常剩余27GB 2024-01-15 10:00:01 - INFO - GPU显存使用情况: 2024-01-15 10:00:01 - INFO - GPU0: 总共24576MB, 已用18432MB (75%) - 正常 2024-01-15 10:00:01 - INFO - 发现2个相关服务在运行: 2024-01-15 10:00:01 - INFO - PID 1234: python.exe 2024-01-15 10:00:01 - INFO - PID 5678: ostrackon_service.exe当C盘空间不足时你会看到清理被触发2024-01-15 14:00:00 - WARNING - C盘空间不足剩余8GB低于阈值10GB 2024-01-15 14:00:00 - INFO - C盘空间不足触发自动清理... 2024-01-15 14:00:05 - INFO - 清理脚本执行成功: 释放空间: 15.2 GB...5.3 常见问题与解决在实际使用中可能会遇到一些问题这里是一些常见情况的处理问题1脚本没有权限删除某些文件原因文件可能被其他程序占用或者需要管理员权限。解决以管理员身份运行PowerShell然后执行脚本。或者检查文件是否被其他程序打开。问题2GPU监控显示未找到nvidia-smi命令原因服务器没有NVIDIA显卡或者没安装显卡驱动。解决如果有GPU但没显示安装NVIDIA驱动和CUDA工具包。如果确实没有GPU可以注释掉GPU监控部分。问题3监控脚本占用CPU过高原因检查间隔太短或者脚本有bug。解决调整check_interval参数从300秒5分钟改为600秒10分钟或更长。问题4清理脚本删除了重要文件原因清理目标目录配置错误。解决立即停止脚本检查cleanup_targets配置确保只包含正确的目录。重要文件可以从归档ZIP中恢复。问题5服务进程检测不到原因进程名称配置不正确。解决修改service_process_names列表添加你实际的服务进程名称。可以在任务管理器中查看进程的准确名称。6. 总结这套自动化监控脚本用下来最大的感受就是省心。以前需要时不时手动检查服务器状态现在脚本自动帮你盯着C盘快满了自动清理服务异常了及时告警。对于跑Ostrakon-VL-8B这类大模型的服务来说稳定性太重要了一个小问题就可能导致服务中断影响线上业务。脚本的设计考虑了实际使用中的各种情况。比如清理不是简单删除而是先归档再删除这样即使误删了重要日志也能找回。监控也不是简单的检查而是结合了磁盘、GPU、服务状态多个维度能更全面地反映系统健康状况。实际部署时建议你先在测试环境跑几天观察日志输出确认清理策略符合预期然后再上生产环境。根据自己服务器的实际情况调整一下检查间隔和清理阈值找到最适合的配置。如果后续有新的监控需求比如想监控网络流量或者特定端口的服务状态可以基于现有脚本扩展模块化的设计让添加新功能比较方便。希望这套脚本能帮你解决服务器维护的烦恼让你更专注于模型应用本身。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。