Lors de l'exécution de programmes ou de processus externes au sein d'une application Go, il est crucial de s'assurer que ces processus peuvent être terminés correctement lorsque le processus Go parent est terminé, soit par l'utilisateur, soit par des événements inattendus. Cela garantit une bonne gestion des ressources et empêche les processus orphelins de persister après la fermeture de l'application.
Pour y parvenir, deux méthodes principales sont disponibles :
Une approche consiste à démarrer le processus enfant dans le même groupe de processus que le processus Go parent. Cela signifie que lorsque le processus parent est tué (par exemple, par un utilisateur envoyant un signal SIGTERM ou SIGKILL), l'ensemble du groupe de processus, y compris le processus enfant, sera également terminé.
Pour configurer le partage de groupe de processus , utilisez le champ SysProcAttr de la structure exec.Cmd :
cmd := exec.Command("./long-process") cmd.SysProcAttr = &syscall.SysProcAttr{ Setpgid: true, }
La deuxième approche consiste à utiliser le champ Pdeathsig de la structure syscall.SysProcAttr. Cela vous permet de spécifier le signal qui doit être envoyé au processus enfant lorsque le processus parent est terminé. Par défaut, Pdeathsig est défini sur 0, ce qui signifie qu'aucun signal spécifique n'est envoyé. Cependant, vous pouvez le définir sur une valeur de signal valide, telle que syscall.SIGTERM, pour garantir que le processus enfant reçoit un signal avant d'être interrompu brusquement par le système d'exploitation :
cmd := exec.Command("./long-process") cmd.SysProcAttr = &syscall.SysProcAttr{ Pdeathsig: syscall.SIGTERM, }
En plus de définir Pdeathsig, vous pouvez également implémenter des gestionnaires de signaux dans votre code Go pour intercepter les signaux de terminaison courants (tels que SIG_INT ou SIG_TERM) et tuez explicitement les processus enfants avant la fin du processus parent.
Notez qu'il n'est généralement pas possible d'attraper le signal SIG_KILL, car il contourne explicitement les gestionnaires de signaux normaux. Par conséquent, il est essentiel d'utiliser des méthodes robustes comme celles décrites ci-dessus pour garantir une terminaison en douceur dans la plupart des scénarios.
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!