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

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

DDD
Libérer: 2024-12-14 00:20:16
original
575 Les gens l'ont consulté

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

Empêcher Ctrl C de perturber exec.Command dans Golang

Lors de l'exécution de commandes à l'aide de exec.Command, il est crucial d'être conscient du potentiel pour les interruptions Ctrl C, même si signal.Notify a été utilisé pour intercepter de tels signaux. Ce problème peut être observé dans l'exemple suivant :

package main

import (
    "log"
    "os"
    "os/exec"
    "os/signal"
    "syscall"
)

func sleep() {
    log.Println("Sleep start")
    cmd := exec.Command("sleep", "60")
    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
}
Copier après la connexion

Lorsque vous appuyez sur Ctrl C pendant que le programme est en cours d'exécution, la sortie indique que la commande « veille » est interrompue, même si le programme principal continue de s'exécuter :

2015/10/16 10:05:50 Sleep start
^C2015/10/16 10:05:52 Receved Ctrl + C
2015/10/16 10:05:52 Sleep stop
Copier après la connexion

La clé pour résoudre ce problème réside dans la reconnaissance que le shell signale l'ensemble du groupe de processus lorsque Ctrl C est enfoncé. Ce comportement peut être évité en démarrant la commande dans son propre groupe de processus à l'aide des champs Setpgid et Pgid dans syscall.SysProcAttr :

cmd := exec.Command("sleep", "60")
cmd.SysProcAttr = &amp;syscall.SysProcAttr{
    Setpgid: true,
}
Copier après la connexion

En incorporant cette modification, la commande "sleep" ne sera plus interrompue par Ctrl C, lui permettant de continuer à fonctionner de manière indépendante.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal