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!