Tauri应用中Python服务在程序关闭后仍然运行,如何解决?

本人使用tauri2开发,vite+vue3,本地启动项目时同时使用sidecar启动一个python二进制程序服务,本地服务停掉之后,python服务没有被关闭掉;
同样的情况在打包之后的软件也有,例如软件1.0.0版本已安装并正在运行,运行1.0.1的安装包会提示终止当前1.0.0的包,点击立即终止之后程序关闭了,但是python服务还在运行;
其他情况下,都是走正常的关闭操作,手动关闭了python服务;
所有,想问一下,tauri有没有关闭之前调用的类似生命周期的方法,不论何种关闭程序的方式下,都会执行的

监听过TauriEvent.WINDOW_CLOSE_REQUESTED和TauriEvent.WINDOW_DESTROYED事件,上述两种关闭方式并没有走这里
本地启动关闭的情况下会提示关闭报错:error: process didn't exit successfully: target\debug\xxx.exe (exit code: 0xc000013a, STATUS_CONTROL_C_EXIT)

阅读 2.8k
avatarAI BotBETA
### 回答

在 Tauri 应用中,如果你希望在应用关闭时确保 Python 服务也被正确终止,你可以利用 Tauri 提供的生命周期钩子(Lifecycle Hooks)来实现这一功能。`TauriEvent.WINDOW_CLOSE_REQUESTED` 事件可能并不总是适用于所有关闭场景,尤其是当应用由于外部操作(如操作系统关闭应用或升级安装新版本)而被终止时。

为了解决这个问题,你可以使用 Tauri 的 `before_close` 生命周期钩子。这个钩子在应用窗口即将关闭时被调用,不论是通过用户操作还是其他方式导致的关闭。你可以在这个钩子中编写代码来终止你的 Python 服务。

以下是如何在 Tauri 应用中设置 `before_close` 钩子的示例:

1. **在 `src-tauri/src/main.rs` 文件中配置 `before_close` 钩子**:
use tauri::{
    Command, Manager, TauriApp, TauriWindowBuilder, WindowBuilderAttributes, WindowEvent,
    WindowMenu,
};
use tauri::generate_context::Command as TauriCommand;
use tauri::system::{ExitCode, Os, OsCommand};

fn main() {
    TauriApp::builder()
        .invoke_handler(tauri::generate_handler![])
        .setup(|app| {
            // 初始化你的应用逻辑,包括启动 Python 服务等
            Ok(())
        })
        .before_close(move |window, event| {
            // 终止 Python 服务的逻辑
            // 假设你通过某种方式获取到了 Python 服务的进程 ID (PID)
            let python_service_pid = /* 获取 Python 服务的 PID */;

            // 使用系统命令终止进程
            if let Some(pid) = python_service_pid {
                Os::cmd("kill")
                    .arg("-9")
                    .arg(pid.to_string())
                    .status()
                    .unwrap_or_else(|_| ExitCode(1));
            }

            // 允许关闭事件继续处理
            Ok(())
        })
        .run(
            TauriWindowBuilder::default()
                .with_title("Your App Title")
                .with_window_menu(WindowMenu::default().into()),
        )
        .expect("error while running tauri application");
}
```

注意:在实际代码中,你需要替换 `/* 获取 Python 服务的 PID */` 部分以正确获取并传递 Python 服务的进程 ID。
  1. 确保在启动 Python 服务时保存其 PID

    在你的 Rust 代码中,当你启动 Python 服务时,你需要保存其进程 ID,以便在 before_close 钩子中使用。这通常可以通过启动进程时捕获其 PID 来实现。

  2. 测试你的应用

    重新编译并运行你的 Tauri 应用,测试各种关闭场景(如正常关闭、通过操作系统关闭、升级安装新版本等),确保 Python 服务在这些情况下都能被正确终止。

通过这种方法,你可以确保无论应用以何种方式关闭,Python 服务都会被正确地终止。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏