Heim >Backend-Entwicklung >Golang >Wie kann verhindert werden, dass Strg C exec.Command in Go unterbricht?

Wie kann verhindert werden, dass Strg C exec.Command in Go unterbricht?

Barbara Streisand
Barbara StreisandOriginal
2024-12-27 20:46:13780Durchsuche

How to Prevent Ctrl C from Interrupting exec.Command in Go?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn