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!