Empêcher Ctrl C d'interrompre exec.Command dans Golang
Lors de l'exécution de processus externes à l'aide de exec.Command, vous pouvez rencontrer un problème où le les processus sont interrompus par Ctrl C même si vous avez intercepté le signal d'interruption.
Ce comportement se produit parce que le le shell signale l’ensemble du groupe de processus lorsque Ctrl C est enfoncé. Le processus parent reçoit le signal et le transmet à tous les processus enfants, provoquant leur interruption.
Pour éviter cela, vous pouvez utiliser syscall.SysProcAttr pour démarrer la commande dans son propre groupe de processus. En définissant le champ Setpgid sur true, vous créez un nouveau groupe de processus pour la commande, en le séparant du processus parent.
Voici comment modifier votre exemple à l'aide de syscall.SysProcAttr :
package main import ( "log" "os" "os/exec" "os/signal" "syscall" ) func sleep() { log.Println("Sleep start") cmd := exec.Command("sleep", "60") cmd.SysProcAttr = &syscall.SysProcAttr{ Setpgid: true, } 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 }
Maintenant, lorsque vous appuyez sur Ctrl C pendant l'exécution, seul le programme principal recevra le signal. La commande sleep continuera à s'exécuter jusqu'à son temps d'exécution de 60 secondes. Cela garantit que le processus n'est pas interrompu de manière inattendue.
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!