Verhindern, dass Strg C den exec.Command in Golang stört
Unterbrechungen durch Strg C können auftreten, wenn exec.Command zum Initiieren von Prozessen verwendet wird. auch wenn Interrupt-Anrufe über signal.Notify abgefangen werden. Dieses Problem tritt auf, weil die Shell beim Empfang von Strg C Signale an die gesamte Prozessgruppe überträgt. Daher sind auch untergeordnete Prozesse betroffen, die mit exec.Command initiiert wurden.
Um dieses Problem zu mildern und zu verhindern, dass Strg C unterbrochen wird Für die untergeordneten Prozesse ist es notwendig, den Befehl mit einer eigenen Prozessgruppe zu etablieren, bevor mit der Ausführung begonnen wird. Dies kann durch die Verwendung der Felder SysProcAttr, Setpgid und Pgid der Struktur syscall.SysProcAttr erreicht werden.
Hier ist ein geändertes Beispiel, das diesen Ansatz beinhaltet:
package main import ( "log" "os" "os/exec" "os/signal" "syscall" ) func sleep() { log.Println("Sleep start") cmd := exec.Command("sleep", "60") cmd.SysProcAttr = &syscall.SysProcAttr{ Setpgid: true, } 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("Received Ctrl + C") }() <-doneChannel }
Mit dieser Änderung, wann Wird Strg C gedrückt, während das Programm ausgeführt wird, erfolgt die folgende Ausgabe produziert:
2015/10/16 10:05:50 Sleep start ^C2015/10/16 10:05:52 Received Ctrl + C
Der Schlafbefehl wird weiterhin erfolgreich ausgeführt und zeigt die Verhinderung einer Unterbrechung durch Strg C.
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!