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
Freigeben: 2024-12-12 19:46:15
Original
228 Leute haben es durchsucht

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
}
Nach dem Login kopieren

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,
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage