Stopping the engine on Windows stops the whole engine
The installer runs the engine as <venv>\Scripts\python.exe, and since Python 3.7.2 that file is a redirector that spawns the real interpreter as a child. Stop() terminated the redirector and left the interpreter - the process holding the cameras and the SQLite WAL - running with no parent and nothing able to stop it. Seen on a Windows install: Quit from the tray, and recognition still running. The child is now started suspended, placed in a job object with KILL_ON_JOB_CLOSE, and resumed. Cancel terminates the job, so the whole tree goes; and the job dies with this process, so it goes even if the app crashes. CREATE_NO_WINDOW while here: python.exe is a console program and a GUI parent otherwise opens a black console on the shop counter. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KGcjxF1cNLcuwc3DAPcnfj
This commit is contained in:
@@ -194,9 +194,29 @@ func (s *Supervisor) runOnce(ctx context.Context) error {
|
||||
return err
|
||||
}
|
||||
cmd.Stderr = cmd.Stdout
|
||||
// Cancel ends the whole process tree, not just the process exec spawned.
|
||||
// `kill` is filled in after Start, once the tree is confined; until then
|
||||
// it is exec's own behaviour.
|
||||
var kill func() error
|
||||
cmd.Cancel = func() error {
|
||||
if kill == nil {
|
||||
return cmd.Process.Kill()
|
||||
}
|
||||
return kill()
|
||||
}
|
||||
prepare(cmd)
|
||||
if err := cmd.Start(); err != nil {
|
||||
return fmt.Errorf("engine failed to start: %w", err)
|
||||
}
|
||||
k, release, err := confine(cmd)
|
||||
if err != nil {
|
||||
// Not fatal: the engine runs, and stopping it falls back to killing
|
||||
// the one process. Logged because on Windows that fallback is the
|
||||
// bug this exists to fix.
|
||||
fmt.Fprintf(s.opts.LogWriter, "supervisor: could not confine engine process tree: %v\n", err)
|
||||
}
|
||||
kill = k
|
||||
defer release()
|
||||
|
||||
pumped := make(chan struct{})
|
||||
go func() {
|
||||
|
||||
Reference in New Issue
Block a user