From 70ef610ce601f2354f552fe56d2070d2ad5ab198 Mon Sep 17 00:00:00 2001 From: EnumDev Date: Sat, 8 Nov 2025 20:06:59 +0200 Subject: [PATCH] Use process group IDs for terminating service subprocesses --- services/agetty-tty1.esv | 3 ++- services/agetty-tty2.esv | 3 ++- services/agetty-tty3.esv | 3 ++- services/agetty-tty4.esv | 3 ++- services/agetty-tty5.esv | 3 ++- services/agetty-tty6.esv | 3 ++- src/esvm/main.go | 1 + src/esvm/service.go | 14 ++++++++++++-- 8 files changed, 25 insertions(+), 8 deletions(-) diff --git a/services/agetty-tty1.esv b/services/agetty-tty1.esv index 8098657..451b9cd 100644 --- a/services/agetty-tty1.esv +++ b/services/agetty-tty1.esv @@ -4,4 +4,5 @@ type: background start_cmd: /usr/bin/setsid /sbin/agetty --noclear tty1 exit_method: kill crash_on_safe_exit: false -restart: always \ No newline at end of file +restart: always +setpgid: false diff --git a/services/agetty-tty2.esv b/services/agetty-tty2.esv index b0658fd..4c1f07a 100644 --- a/services/agetty-tty2.esv +++ b/services/agetty-tty2.esv @@ -4,4 +4,5 @@ type: background start_cmd: /usr/bin/setsid /sbin/agetty tty2 exit_method: kill crash_on_safe_exit: false -restart: always \ No newline at end of file +restart: always +setpgid: false diff --git a/services/agetty-tty3.esv b/services/agetty-tty3.esv index 410db21..e635586 100644 --- a/services/agetty-tty3.esv +++ b/services/agetty-tty3.esv @@ -4,4 +4,5 @@ type: background start_cmd: /usr/bin/setsid /sbin/agetty tty3 exit_method: kill crash_on_safe_exit: false -restart: always \ No newline at end of file +restart: always +setpgid: false diff --git a/services/agetty-tty4.esv b/services/agetty-tty4.esv index f9471d3..1f2fb78 100644 --- a/services/agetty-tty4.esv +++ b/services/agetty-tty4.esv @@ -4,4 +4,5 @@ type: background start_cmd: /usr/bin/setsid /sbin/agetty tty4 exit_method: kill crash_on_safe_exit: false -restart: always \ No newline at end of file +restart: always +setpgid: false diff --git a/services/agetty-tty5.esv b/services/agetty-tty5.esv index 7df12e7..6f0e9ca 100644 --- a/services/agetty-tty5.esv +++ b/services/agetty-tty5.esv @@ -4,4 +4,5 @@ type: background start_cmd: /usr/bin/setsid /sbin/agetty tty5 exit_method: kill crash_on_safe_exit: false -restart: always \ No newline at end of file +restart: always +setpgid: false diff --git a/services/agetty-tty6.esv b/services/agetty-tty6.esv index fb40d4b..0ecd9b0 100644 --- a/services/agetty-tty6.esv +++ b/services/agetty-tty6.esv @@ -4,4 +4,5 @@ type: background start_cmd: /usr/bin/setsid /sbin/agetty tty6 exit_method: kill crash_on_safe_exit: false -restart: always \ No newline at end of file +restart: always +setpgid: false diff --git a/src/esvm/main.go b/src/esvm/main.go index 643237d..0e63100 100644 --- a/src/esvm/main.go +++ b/src/esvm/main.go @@ -152,6 +152,7 @@ func Init() { ExitMethod: "", StopCmd: "", Restart: "", + Setpgid: true, CrashOnSafeExit: true, LogOutput: true, Filepath: path.Join(serviceConfigDir, "services", entry.Name()), diff --git a/src/esvm/service.go b/src/esvm/service.go index 37fb615..b9964ae 100644 --- a/src/esvm/service.go +++ b/src/esvm/service.go @@ -48,6 +48,7 @@ type EnitService struct { StopCmd string `yaml:"stop_cmd,omitempty"` Restart string `yaml:"restart,omitempty"` ReadyFd int `yaml:"ready_fd"` + Setpgid bool `yaml:"setpgid"` LogOutput bool `yaml:"log_output,omitempty"` Filepath string filepathChecksum [32]byte @@ -157,6 +158,7 @@ func (service *EnitService) ReloadService() { ExitMethod: "", StopCmd: "", Restart: "", + Setpgid: true, CrashOnSafeExit: true, LogOutput: true, Filepath: service.Filepath, @@ -225,6 +227,7 @@ func (service *EnitService) StartService() (err error) { } cmd := exec.Command("/bin/sh", "-c", "exec "+service.StartCmd) + cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: service.Setpgid, Pgid: 0} if logFile != nil { cmd.Stdout = logFile cmd.Stderr = logFile @@ -278,8 +281,8 @@ func (service *EnitService) StartService() (err error) { logFile.Close() } - // Kill process - cmd.Process.Kill() + // Kill process and children + syscall.Kill(-service.processID, syscall.SIGKILL) service.processID = 0 service.state = EnitServiceCrashed @@ -302,6 +305,9 @@ func (service *EnitService) StartService() (err error) { case <-service.stopChannel: service.restartCount = 0 default: + // Kill remaining child processes + syscall.Kill(-service.processID, syscall.SIGKILL) + if service.Type == "simple" && err == nil { service.restartCount = 0 if service.ExitMethod != "stop_command" { @@ -363,9 +369,13 @@ func (service *EnitService) StopService() error { } logger.Printf("Stopping service (%s)...", service.Name) + pid := service.processID newServiceStatus := EnitServiceCrashed defer func() { + // Kill remaining child processes + syscall.Kill(-pid, syscall.SIGKILL) + service.state = newServiceStatus service.processID = 0