Heim >Backend-Entwicklung >Golang >Wie kann ich verhindern, dass Strg C „exec.Command'-Prozesse in Go unterbricht?

Wie kann ich verhindern, dass Strg C „exec.Command'-Prozesse in Go unterbricht?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-12 19:46:15240Durchsuche

How Can I Prevent Ctrl C from Interrupting `exec.Command` Processes in Go?

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!

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