Verhindern von Ctrl C-Unterbrechungen von exec.Command-Prozessen
Trotz des Abfangens von Interrupt-Aufrufen über signal.Notify bleiben mit exec.Command gestartete Prozesse anfällig zur Unterbrechung durch Strg C. Beachten Sie Folgendes Demonstration:
package main import ( "log" "os" "os/exec" "os/signal" "syscall" ) func main() { var doneChannel = make(chan bool) go func() { log.Println("Sleep start") cmd := exec.Command("sleep", "60") cmd.Run() log.Println("Sleep stop") }() c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) signal.Notify(c, syscall.SIGTERM) go func() { <-c log.Println("Receved Ctrl + C") }() <-doneChannel }
Durch Drücken von Strg C während der Programmausführung wird eine Ausgabe erzeugt, die darauf hinweist, dass der Befehl „sleep“ unterbrochen wurde, obwohl das Hauptprogramm nicht beendet wurde.
Lösung: Steuerung des Prozessgruppe
Die Unterbrechung entsteht dadurch, dass die Shell die gesamte Prozessgruppe signalisiert, wenn Strg C gedrückt wird. Um den untergeordneten Prozess von diesem Signal zu isolieren, muss der Befehl in seiner eigenen Prozessgruppe gestartet werden. Dies kann erreicht werden, indem die Felder SysProcAttr.Setpgid und SysProcAttr.Pgid vor dem Starten des Prozesses festgelegt werden:
cmd := exec.Command("sleep", "60") cmd.SysProcAttr = &syscall.SysProcAttr{ Setpgid: true, }
Durch Befolgen dieser Schritte kann das Hauptprogramm Strg-C-Signale abfangen, ohne Prozesse zu unterbrechen, die mit exec.Command gestartet wurden , um eine stabile Prozessausführung sicherzustellen.
Das obige ist der detaillierte Inhalt vonWie kann ich verhindern, dass Strg C „exec.Command'-Prozesse in Go unterbricht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!