Pourquoi ne va-t-il pas tuer un processus enfant à l'aide de Process.Signal ?
Dans l'extrait de code fourni, le processus est censé être tué à l'aide de cmd.Process.Signal(syscall.SIGKILL) après un délai d'attente spécifié. Cependant, le délai d'attente ne fonctionne pas correctement. Malgré l'impression de « C'est mort Jim », le processus continue de s'exécuter et « Terminé en attente » ne s'imprime jamais.
Le problème
Le problème ici est lié au fait que cmd.Process.Signal ne tue pas les processus enfants. Les processus enfants ont leurs propres groupes de processus et doivent être tués séparément.
Solution
Pour résoudre ce problème, une approche différente peut être adoptée en utilisant syscall.Getpgid et syscall.Kill :
import "syscall" cmd := exec.Command(some_command) cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} cmd.Start() pgid, err := syscall.Getpgid(cmd.Process.Pid) if err == nil { syscall.Kill(-pgid, 15) // note the minus sign } cmd.Wait()
En utilisant SysProcAttr.Setpgid = true, un groupe de processus distinct est créé pour le processus enfant. Ensuite, syscall.Getpgid récupère l'ID de groupe de processus (pgid) du processus enfant. Enfin, syscall.Kill(-pgid, 15) est appelé pour envoyer un signal SIGTERM à l'ensemble du groupe de processus, tuant ainsi à la fois le processus enfant et ses processus enfants.
Avertissements
Cette solution peut ne pas fonctionner sur toutes les plateformes. Il a été confirmé qu'il fonctionne sur macOS et Linux, mais son comportement sur d'autres systèmes d'exploitation est incertain.
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!