@@ -2,16 +2,13 @@ package frontend
22
33import (
44 "bufio"
5- "errors"
65 "fmt"
76 "io"
87 "os"
98 "os/exec"
10- "runtime"
119 "sort"
1210 "strings"
1311 "sync"
14- "syscall"
1512 "time"
1613
1714 "github.com/bjartek/aether/pkg/events"
@@ -90,9 +87,7 @@ func (m *FrontendManager) Start(teaProgram *tea.Program) error {
9087 }
9188
9289 cmd := exec .Command (parts [0 ], parts [1 :]... )
93- if runtime .GOOS != "windows" {
94- cmd .SysProcAttr = & syscall.SysProcAttr {Setpgid : true }
95- }
90+ setupProcessGroup (cmd )
9691
9792 if wd , err := os .Getwd (); err != nil {
9893 m .logger .Warn ().Err (err ).Msg ("Failed to get working directory for frontend process; using shell default" )
@@ -245,30 +240,7 @@ func (m *FrontendManager) Stop() error {
245240 }
246241
247242 m .logger .Info ().Msg ("Stopping frontend process" )
248- var err error
249-
250- if runtime .GOOS == "windows" {
251- err = m .cmd .Process .Kill ()
252- } else {
253- pgid , pgErr := syscall .Getpgid (m .cmd .Process .Pid )
254- if pgErr != nil {
255- err = m .cmd .Process .Kill ()
256- } else {
257- // Attempt graceful shutdown
258- termErr := syscall .Kill (- pgid , syscall .SIGTERM )
259- if termErr != nil && ! errors .Is (termErr , syscall .ESRCH ) {
260- err = termErr
261- }
262-
263- // Give process a brief moment to exit before forcing
264- time .Sleep (250 * time .Millisecond )
265-
266- killErr := syscall .Kill (- pgid , syscall .SIGKILL )
267- if killErr != nil && ! errors .Is (killErr , syscall .ESRCH ) {
268- err = killErr
269- }
270- }
271- }
243+ err := stopProcess (m .cmd )
272244
273245 if err != nil {
274246 m .logger .Error ().Err (err ).Msg ("Failed to stop frontend process" )
0 commit comments