Maison >développement back-end >Golang >Pourquoi « Process.Signal » ne tue-t-il pas les processus enfants dans Go ?

Pourquoi « Process.Signal » ne tue-t-il pas les processus enfants dans Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-27 17:37:15357parcourir

Why Doesn't `Process.Signal` Kill Child Processes in Go?

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!

Déclaration:
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