From 5018bb56b84fe6788931bb38a239f6db13e4cdf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C=E8=A7=82=E5=AF=9F=E6=97=A5=E5=BF=97?= Date: Fri, 24 Oct 2025 12:14:56 +0800 Subject: [PATCH] feat: exit when qemu crashes --- src/cmd.py | 2 +- src/qemu.py | 6 ++++++ src/utils.py | 7 ++++++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/cmd.py b/src/cmd.py index a8c7b20..d22dc72 100644 --- a/src/cmd.py +++ b/src/cmd.py @@ -37,7 +37,7 @@ class InteractiveShell: if it(Config).localInstance.enable: loop.run_until_complete(self.localInstance.launch_instance(loop)) it(GlobalLogger).logger.info("Waiting for wrapper-manager to start...") - loop.run_until_complete(countdown(it(Config).localInstance.timeout)) + loop.run_until_complete(countdown(it(Config).localInstance.timeout, self.localInstance)) it(Config).instance.url = "127.0.0.1:32767" it(Config).instance.secure = False loop.run_until_complete(it(WrapperManager).init(it(Config).instance.url, it(Config).instance.secure)) diff --git a/src/qemu.py b/src/qemu.py index b0396bf..e550459 100644 --- a/src/qemu.py +++ b/src/qemu.py @@ -31,6 +31,12 @@ class QemuInstance: def terminate(self): self.proc.result().kill() + def running(self): + if self.proc.done(): + return not bool(self.proc.result().returncode) + else: + return True + async def get_instance_image(self): it(GlobalLogger).logger.warning("The wrapper-manager image does not exist. Downloading...") async with httpx.AsyncClient(follow_redirects=True) as client: diff --git a/src/utils.py b/src/utils.py index 490db57..dd7dccb 100644 --- a/src/utils.py +++ b/src/utils.py @@ -2,6 +2,7 @@ import asyncio import concurrent.futures import json import subprocess +import sys import time from asyncio import AbstractEventLoop from copy import deepcopy @@ -21,6 +22,7 @@ from src.exceptions import NotTimeSyncedLyricsException from src.logger import GlobalLogger from src.models import PlaylistInfo from src.models.album_meta import Tracks +from src.qemu import QemuInstance from src.types import * executor_pool = concurrent.futures.ThreadPoolExecutor() @@ -319,8 +321,11 @@ def config_outdated(): return LooseVersion(it(Config).version) < LooseVersion(CONFIG_VERSION) -async def countdown(seconds: int): +async def countdown(seconds: int, qemuInstance: QemuInstance): while seconds > 0: + if not qemuInstance.running(): + it(GlobalLogger).logger.error("Failed to start qemu") + sys.exit() mins, secs = divmod(seconds, 60) # Convert seconds to minutes and remaining seconds timeformat = '{:02d}:{:02d}'.format(mins, secs) # Format for MM:SS display print(timeformat, end='\r') # Print on the same line, overwriting previous output