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 }
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
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 = &syscall.SysProcAttr{ Setpgid: true, }
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!