Verhindern, dass Strg C exec.Command in Golang stört
Beim Ausführen von Befehlen mit exec.Command ist es wichtig, sich des Potenzials bewusst zu sein für Strg-C-Unterbrechungen, auch wenn signal.Notify zum Abfangen solcher Signale verwendet wurde. Dieses Problem kann im folgenden Beispiel beobachtet werden:
package main import ( "log" "os" "os/exec" "os/signal" "syscall" ) func sleep() { log.Println("Sleep start") cmd := exec.Command("sleep", "60") cmd.Run() log.Println("Sleep stop") } func main() { var doneChannel = make(chan bool) go sleep() 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 }
Wenn Sie Strg C drücken, während das Programm ausgeführt wird, zeigt die Ausgabe an, dass der Befehl „sleep“ unterbrochen wird, obwohl das Hauptprogramm weiterhin ausgeführt wird:
2015/10/16 10:05:50 Sleep start ^C2015/10/16 10:05:52 Receved Ctrl + C 2015/10/16 10:05:52 Sleep stop
Der Schlüssel zur Lösung dieses Problems liegt darin, zu erkennen, dass die Shell die gesamte Prozessgruppe signalisiert, wenn Strg C gedrückt wird. Dieses Verhalten kann verhindert werden, indem der Befehl in einer eigenen Prozessgruppe mithilfe der Felder Setpgid und Pgid in syscall.SysProcAttr gestartet wird:
cmd := exec.Command("sleep", "60") cmd.SysProcAttr = &syscall.SysProcAttr{ Setpgid: true, }
Durch die Einbindung dieser Änderung wird der Befehl „sleep“ nicht mehr unterbrochen Strg C, damit es unabhängig weiterlaufen kann.
Das obige ist der detaillierte Inhalt vonWie kann ich verhindern, dass Strg C „exec.Command' in Go unterbricht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!