Fix RunAndWait() process detection
Fixed incorrect browser exit detection in RunAndWait() which could lead to Browser file corruption due to incomplete updates.
This commit is contained in:
parent
f34f335206
commit
c1b669e49a
1 changed files with 18 additions and 10 deletions
28
run_win.go
28
run_win.go
|
@ -9,7 +9,10 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"syscall"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"golang.org/x/sys/windows"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Run locates and starts the installed Spitfire browser without waiting for it to exit.
|
// Run locates and starts the installed Spitfire browser without waiting for it to exit.
|
||||||
|
@ -33,7 +36,6 @@ func RunAndWait() error {
|
||||||
return fmt.Errorf("failed to get install directory: %w", err)
|
return fmt.Errorf("failed to get install directory: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Construct the browser executable path
|
|
||||||
exePath := filepath.Join(installDir, "browser", "spitfire.exe")
|
exePath := filepath.Join(installDir, "browser", "spitfire.exe")
|
||||||
if _, err := os.Stat(exePath); err != nil {
|
if _, err := os.Stat(exePath); err != nil {
|
||||||
return fmt.Errorf("browser executable not found at %s: %w", exePath, err)
|
return fmt.Errorf("browser executable not found at %s: %w", exePath, err)
|
||||||
|
@ -42,23 +44,29 @@ func RunAndWait() error {
|
||||||
cmd := exec.Command(exePath)
|
cmd := exec.Command(exePath)
|
||||||
cmd.Stdout = os.Stdout
|
cmd.Stdout = os.Stdout
|
||||||
cmd.Stderr = os.Stderr
|
cmd.Stderr = os.Stderr
|
||||||
|
cmd.Dir = filepath.Join(installDir, "browser")
|
||||||
|
|
||||||
// Use CREATE_NEW_PROCESS_GROUP flag for Windows
|
// Create job object starting the process
|
||||||
cmd.SysProcAttr = &syscall.SysProcAttr{
|
job, err := windows.CreateJobObject(nil, nil)
|
||||||
CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP,
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to create job object: %w", err)
|
||||||
}
|
}
|
||||||
|
defer windows.CloseHandle(job)
|
||||||
|
|
||||||
fmt.Printf("Starting browser: %s\n", exePath)
|
fmt.Printf("Starting browser: %s\n", exePath)
|
||||||
if err := cmd.Start(); err != nil {
|
if err := cmd.Start(); err != nil {
|
||||||
return fmt.Errorf("failed to start browser: %w", err)
|
return fmt.Errorf("failed to start browser: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("Browser process started with PID %d\n", cmd.Process.Pid)
|
for {
|
||||||
|
cmd := exec.Command("tasklist", "/FI", "IMAGENAME eq spitfire.exe")
|
||||||
if err := cmd.Wait(); err != nil {
|
output, _ := cmd.Output()
|
||||||
return fmt.Errorf("browser exited with error: %w", err)
|
if !strings.Contains(string(output), "spitfire.exe") {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
time.Sleep(1 * time.Second)
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println("Browser exited successfully.")
|
fmt.Println("Browser exited.")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue