Heim >Backend-Entwicklung >Golang >Warum beendet „Process.Signal' untergeordnete Prozesse in Go nicht?

Warum beendet „Process.Signal' untergeordnete Prozesse in Go nicht?

Barbara Streisand
Barbara StreisandOriginal
2024-11-27 17:37:15292Durchsuche

Why Doesn't `Process.Signal` Kill Child Processes in Go?

Warum wird ein untergeordneter Prozess nicht mithilfe von Process.Signal beendet?

Im bereitgestellten Codeausschnitt soll der Prozess so sein mit cmd.Process.Signal(syscall.SIGKILL) nach einem angegebenen Timeout beendet. Das Timeout funktioniert jedoch nicht ordnungsgemäß. Obwohl „Es ist tot, Jim“ gedruckt wird, läuft der Prozess weiter und „Fertig warten“ wird nie gedruckt.

Das Problem

Das Problem hier hängt mit der Tatsache zusammen dass cmd.Process.Signal untergeordnete Prozesse nicht beendet. Untergeordnete Prozesse haben ihre eigenen Prozessgruppen und müssen separat beendet werden.

Lösung

Um dieses Problem zu beheben, kann ein anderer Ansatz gewählt werden, indem syscall.Getpgid und verwendet werden syscall.Kill:

import "syscall"

cmd := exec.Command(some_command)
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
cmd.Start()

pgid, err := syscall.Getpgid(cmd.Process.Pid)
if err == nil {
    syscall.Kill(-pgid, 15)  // note the minus sign
}

cmd.Wait()

Durch die Verwendung von SysProcAttr.Setpgid = true wird eine separate Prozessgruppe für erstellt der untergeordnete Prozess. Anschließend ruft syscall.Getpgid die Prozessgruppen-ID (pgid) des untergeordneten Prozesses ab. Schließlich wird syscall.Kill(-pgid, 15) aufgerufen, um ein SIGTERM-Signal an die gesamte Prozessgruppe zu senden, wodurch sowohl der untergeordnete Prozess als auch seine untergeordneten Prozesse effektiv beendet werden.

Vorbehalte

Diese Lösung funktioniert möglicherweise nicht auf allen Plattformen. Es wurde bestätigt, dass es unter macOS und Linux funktioniert, sein Verhalten auf anderen Betriebssystemen ist jedoch ungewiss.

Das obige ist der detaillierte Inhalt vonWarum beendet „Process.Signal' untergeordnete Prozesse in Go nicht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn