Heim >Backend-Entwicklung >Golang >Wie kann verhindert werden, dass Strg C exec.Command in Go unterbricht?
Verhindern, dass Strg C exec.Command in Golang unterbricht
Beim Ausführen externer Prozesse mit exec.Command kann es zu einem Problem kommen, bei dem die Prozesse werden durch Strg C unterbrochen, auch wenn Sie das Interrupt-Signal abgefangen haben.
Dieses Verhalten tritt auf, weil Die Shell signalisiert der gesamten Prozessgruppe, wenn Strg C gedrückt wird. Der übergeordnete Prozess empfängt das Signal und leitet es an alle untergeordneten Prozesse weiter, wodurch diese unterbrochen werden.
Um dies zu verhindern, können Sie den Befehl mit syscall.SysProcAttr in einer eigenen Prozessgruppe starten. Indem Sie das Setpgid-Feld auf true setzen, erstellen Sie eine neue Prozessgruppe für den Befehl und trennen ihn vom übergeordneten Prozess.
So ändern Sie Ihr Beispiel mit syscall.SysProcAttr:
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("Receved Ctrl + C") }() <-doneChannel }
Wenn Sie jetzt während der Ausführung Strg C drücken, empfängt nur das Hauptprogramm das Signal. Der Schlafbefehl wird bis zu seiner Abschlusszeit von 60 Sekunden weiter ausgeführt. Dadurch wird sichergestellt, dass der Prozess nicht unerwartet unterbrochen wird.
Das obige ist der detaillierte Inhalt vonWie kann verhindert werden, dass Strg C exec.Command in Go unterbricht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!