- 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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user