fix: retry logic for 'marked for deletion' Windows SCM race
CI / test (push) Successful in 2m15s

- Clean up both sc.exe and nssm services before install
- Wait 1s after remove for SCM to release
- Retry up to 3x with 3s delay if 'marked for deletion'
- Added import time for sleep calls
This commit is contained in:
2026-08-03 17:08:54 -04:00
parent 4129379ca5
commit 51dcefc98d
+26 -6
View File
@@ -1,6 +1,7 @@
module main
import os
import time
pub fn service_install(config_path string, quiet bool) ! {
exe_path := os.executable()
@@ -36,16 +37,35 @@ pub fn service_install(config_path string, quiet bool) ! {
}
println(' Using nssm: ${nssm_exe}')
// Remove previous install if exists
os.execute('"${nssm_exe}" stop ${name}')
os.execute('"${nssm_exe}" remove ${name} confirm')
// Remove previous installs (both sc.exe and nssm)
os.execute('sc stop ${name} 2>nul')
os.execute('sc delete ${name} 2>nul')
os.execute('"${nssm_exe}" stop ${name} 2>nul')
os.execute('"${nssm_exe}" remove ${name} confirm 2>nul')
// Install the service
r := os.execute('"${nssm_exe}" install ${name} "${exe_path}" ${args}')
if r.exit_code != 0 {
// Wait for SCM to release any "marked for deletion" state
time.sleep(1 * time.second)
// Install the service (retry up to 3 times for "marked for deletion")
mut installed := false
for attempt := 1; attempt <= 3; attempt++ {
r := os.execute('"${nssm_exe}" install ${name} "${exe_path}" ${args}')
if r.exit_code == 0 {
installed = true
break
}
if r.output.contains('marked for deletion') {
println(' Service still marked for deletion, waiting...')
time.sleep(3 * time.second)
continue
}
eprintln('nssm install failed: ${r.output}')
exit(1)
}
if !installed {
eprintln('nssm install failed after 3 attempts. Close services.msc and try again.')
exit(1)
}
println(' Service registered.')
// Configure service