From 51dcefc98d511f59486e247ebbc35a5ed95abaaf Mon Sep 17 00:00:00 2001 From: Bruno Charest Date: Mon, 3 Aug 2026 17:08:54 -0400 Subject: [PATCH] fix: retry logic for 'marked for deletion' Windows SCM race - 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 --- service.v | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/service.v b/service.v index 95e3cfb..7eae002 100644 --- a/service.v +++ b/service.v @@ -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