Skip to content

Commit 1c1096a

Browse files
Nicolettaclaude
authored andcommitted
fix: Backend-Prozessbaum per taskkill /T beenden (PyInstaller --onefile)
PyInstaller --onefile startet auf Windows einen Bootloader-Prozess der einen Python-Child-Prozess spawnt. child.kill() beendet nur den Parent; taskkill /F /T /PID killt den gesamten Prozessbaum inkl. uvicorn. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 6c5e8fa commit 1c1096a

File tree

2 files changed

+30
-10
lines changed

2 files changed

+30
-10
lines changed

src-tauri/src/lib.rs

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,26 @@ fn get_backend_port(state: tauri::State<BackendPort>) -> u16 {
1515
*state.0.lock().unwrap()
1616
}
1717

18-
/// IPC-Command: Frontend beendet den Backend-Sidecar explizit vor dem Update-Exit
18+
/// IPC-Command: Frontend beendet den Backend-Sidecar explizit (beim Schließen und vor Update-Exit).
19+
/// PyInstaller --onefile startet auf Windows zwei Prozesse (Bootloader + Python-Child).
20+
/// child.kill() beendet nur den Bootloader – /T killt den gesamten Prozessbaum.
1921
#[tauri::command]
2022
fn kill_backend(state: tauri::State<BackendChild>) {
2123
if let Some(child) = state.0.lock().unwrap().take() {
24+
#[cfg(target_os = "windows")]
25+
let pid = child.pid();
26+
2227
let _ = child.kill();
23-
log::info!("Backend-Sidecar vor Update-Exit explizit beendet");
28+
29+
#[cfg(target_os = "windows")]
30+
{
31+
let _ = std::process::Command::new("taskkill")
32+
.args(["/F", "/T", "/PID", &pid.to_string()])
33+
.output();
34+
log::info!("Backend-Sidecar Prozessbaum (PID {}) per taskkill /T beendet", pid);
35+
}
36+
#[cfg(not(target_os = "windows"))]
37+
log::info!("Backend-Sidecar beendet");
2438
}
2539
}
2640

@@ -72,14 +86,20 @@ pub fn run() {
7286
.expect("Fehler beim Erstellen der Tauri-Anwendung")
7387
.run(|app_handle, event| {
7488
if let tauri::RunEvent::Exit = event {
75-
if let Some(child) = app_handle
76-
.state::<BackendChild>()
77-
.0
78-
.lock()
79-
.unwrap()
80-
.take()
81-
{
89+
if let Some(child) = app_handle.state::<BackendChild>().0.lock().unwrap().take() {
90+
#[cfg(target_os = "windows")]
91+
let pid = child.pid();
92+
8293
let _ = child.kill();
94+
95+
#[cfg(target_os = "windows")]
96+
{
97+
let _ = std::process::Command::new("taskkill")
98+
.args(["/F", "/T", "/PID", &pid.to_string()])
99+
.output();
100+
log::info!("Backend-Sidecar Prozessbaum (PID {}) per taskkill /T beendet", pid);
101+
}
102+
#[cfg(not(target_os = "windows"))]
83103
log::info!("Backend-Sidecar beendet");
84104
}
85105
}

src/frontend/src/data/changelog.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export const CHANGELOG: ChangelogVersion[] = [
2626
version: 'v0.1.19',
2727
datum: 'März 2026',
2828
eintraege: [
29-
{ typ: 'fix', text: 'Backend-Sidecar wird beim App-Schließen (X-Button) und beim Update zuverlässig beendet – onCloseRequested fängt den Exit ab und ruft kill_backend direkt auf' },
29+
{ typ: 'fix', text: 'Backend-Sidecar wird beim App-Schließen zuverlässig beendet – PyInstaller --onefile startet auf Windows zwei Prozesse; taskkill /T beendet jetzt den gesamten Prozessbaum' },
3030
],
3131
},
3232
{

0 commit comments

Comments
 (0)