Maison >développement back-end >Golang >Comment puis-je empêcher Ctrl C d'interrompre les processus « exec.Command » dans Go ?

Comment puis-je empêcher Ctrl C d'interrompre les processus « exec.Command » dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-12 19:46:15230parcourir

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

Prévenir l'interruption Ctrl C des processus exec.Command

Malgré l'interception des appels d'interruption via signal.Notify, les processus démarrés avec exec.Command restent sensibles à l'interruption par Ctrl C. Considérez la démonstration suivante :

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
}

Appuyer sur Ctrl C pendant l'exécution du programme produira une sortie indiquant que la commande "veille" a été interrompue, même si le programme principal ne se termine pas.

Solution : Contrôler le groupe de processus

L'interruption provient du shell signalant l’ensemble du groupe de processus lorsque Ctrl C est enfoncé. Pour isoler le processus enfant de ce signal, la commande doit être lancée dans son propre groupe de processus. Ceci peut être réalisé en définissant les champs SysProcAttr.Setpgid et SysProcAttr.Pgid avant de démarrer le processus :

cmd := exec.Command("sleep", "60")
cmd.SysProcAttr = &syscall.SysProcAttr{
    Setpgid: true,
}

En suivant ces étapes, le programme principal peut intercepter les signaux Ctrl C sans interrompre les processus démarrés avec exec.Command. , garantissant une exécution stable du processus.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn