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
Libérer: 2024-12-12 19:46:15
original
227 Les gens l'ont consulté

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
}
Copier après la connexion

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,
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal