(self)
| 337 | |
| 338 | # 轮询任务(固定延迟执行) |
| 339 | def polling_task(self): |
| 340 | while True: |
| 341 | # 经测试等于1分钟时原版RCON会出现timeout |
| 342 | if self.restart_interval < 60: |
| 343 | INFO.logger.error("[ 轮询任务 ] 服务器重启时间 restart_interval 必须大于1分钟,请重新设置!") |
| 344 | print("[ 轮询任务 ] 服务器重启时间 restart_interval 必须大于1分钟,请重新设置!") |
| 345 | time.sleep(2) |
| 346 | sys.exit(0) |
| 347 | |
| 348 | # 启动程序前检查, 如果存在服务端则不再进行启动操作,改为每次循环结尾关闭进程 |
| 349 | is_running = self.is_palserver_running() |
| 350 | INFO.logger.info(f"[ 轮询任务 ] 当前 PalServer 进程运行状态:{is_running}") |
| 351 | if not is_running and (not self.is_restarting): |
| 352 | INFO.logger.info("[ 前置检查 ] 未检测到 PalServer 服务,正在启动......") |
| 353 | print("[ 前置检查 ] 未检测到 PalServer 服务,正在启动......") |
| 354 | self.start_program() |
| 355 | |
| 356 | INFO.logger.info(f'[ 轮询任务 ] 服务器将进入重启倒计时,设置时长为 {self.conf["restart_interval"]} 秒......') |
| 357 | print(f'\r[ 轮询任务 ] 服务器将进入重启倒计时,设置时长为 {self.conf["restart_interval"]} 秒......') |
| 358 | |
| 359 | # 服务器持续运行时间(重启间隔) |
| 360 | for i in range(int(self.restart_interval), 0, -1): |
| 361 | print("\r\033[K", end='') # 清除当前行 |
| 362 | print(f'\r[ 轮询任务 ] 服务器将在 {i} 秒后重启......', end='') |
| 363 | time.sleep(1) |
| 364 | # 检查内存使用情况 |
| 365 | if self.memory_monitor_enabled: |
| 366 | if self.polling_interval_seconds > 5: |
| 367 | mem_info = psutil.virtual_memory() |
| 368 | mem_usage = mem_info.percent # 获取内存使用百分比 |
| 369 | |
| 370 | # 内存超限关服消息提醒 |
| 371 | if mem_usage > self.memory_usage_threshold: |
| 372 | self.is_restarting = True # 开始重启 |
| 373 | max_notice_time = max(map(int, self.shutdown_notice.keys())) # 获取最大关服通知时间 |
| 374 | INFO.logger.error( |
| 375 | f"[ 内存监控 ] 内存使用超过{self.memory_usage_threshold}%,正在重启程序......") |
| 376 | print(f"\r[ 内存监控 ] 内存使用超过{self.memory_usage_threshold}%,正在重启程序......") |
| 377 | time.sleep(1) |
| 378 | # 倒计时关闭服务端 |
| 379 | for j in range(max_notice_time, 0, -1): |
| 380 | time.sleep(1) |
| 381 | self.send_shutdown_notice(j) |
| 382 | # 关服之前执行一次SAVE |
| 383 | if self.rcon_enabled: |
| 384 | success, response = self.send_rcon_command("Save") |
| 385 | if success: |
| 386 | INFO.logger.info('[ RCON ] 存档已保存 {0}'.format(response)) |
| 387 | print('\r[ RCON ] 存档已保存', response) |
| 388 | time.sleep(3) |
| 389 | else: |
| 390 | INFO.logger.error('[ RCON ] 存档保存失败: {0}'.format(response)) |
| 391 | self.close_process() |
| 392 | self.is_first_run = True |
| 393 | time.sleep(5) |
| 394 | self.start_program() |
| 395 | self.is_restarting = False # 重启完成 |
| 396 |
nothing calls this directly
no test coverage detected