"""定时维护命令。 用法: python manage.py maintenance # 同 --once python manage.py maintenance --once # 执行一轮(清理过期任务/临时文件、按需备份) python manage.py maintenance --loop # 常驻:启动即一轮,之后每小时醒来检查 """ import time from django.core.management.base import BaseCommand from rdgenerator import maintenance class Command(BaseCommand): help = '清理过期构建任务与临时文件,并按设置定期备份 SQLite 数据库。' LOOP_INTERVAL = 3600 # 每小时醒来一次(备份内部按 24h 间隔节流) def add_arguments(self, parser): parser.add_argument( '--loop', action='store_true', help='常驻模式:容器启动后在后台持续运行。', ) parser.add_argument( '--once', action='store_true', help='只执行一轮后退出(默认行为,也供后台「立即执行」使用)。', ) def handle(self, *args, **options): if options['loop']: self.stdout.write('[maintenance] 守护进程已启动,每小时检查一次。') while True: self._run_once() time.sleep(self.LOOP_INTERVAL) else: self._run_once() def _run_once(self): result = maintenance.run_maintenance() self.stdout.write( '[maintenance] 清理过期任务 {deleted_builds} 条、临时文件 {deleted_temp_files} 个、' '轮转旧备份 {rotated_backups} 份;备份:{backup}'.format( deleted_builds=result['deleted_builds'], deleted_temp_files=result['deleted_temp_files'], rotated_backups=result['rotated_backups'], backup=('已创建 ' + result['backup_created']) if result['backup_created'] else ('本轮跳过' if result['backup_skipped'] else '未创建'), ) )