Maison  >  Article  >  développement back-end  >  Comment exécuter des processus de longue durée dans Golang et les empêcher de devenir des zombies ?

Comment exécuter des processus de longue durée dans Golang et les empêcher de devenir des zombies ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-27 21:16:01386parcourir

How to Execute Long-Running Processes in Golang and Prevent Them From Becoming Zombies?

Exécuter la commande dans Golang et la détacher du processus

Ce problème survient lorsque vous devez exécuter un processus de longue durée dans Golang, avec exigences spécifiques telles que :

  • Redirection de la sortie standard du processus vers un fichier
  • Contrôle de l'utilisateur du processus
  • Assurer que le processus continue de s'exécuter même après la fermeture du programme parent
  • Empêcher le processus de devenir un zombie lorsqu'il plante
  • Obtention du PID du processus en cours

Votre tentative de solution en utilisant Cmd.Start() et Cmd.Wait() remplit la plupart de ces exigences, à l'exception d'empêcher le processus sous-jacent de planter lorsque vous envoyez SIGTERM/SIGKILL à votre programme.

Solution

Au lieu d'essayer de réinventer la roue, envisagez d'utiliser l'une des bibliothèques suivantes :

  • https://github.com/krallin/tini
  • https://busybox.net/
  • https : //software.clapper.org/daemonize/
  • https://wiki.gentoo.org/wiki/OpenRC
  • https://www.freedesktop.org/wiki/Software/systemd /

Bibliothèque Go-reap

Une solution recommandée consiste à utiliser la bibliothèque https://github.com/hashicorp/go-reap.

Notes

  • Votre hypothèse concernant le détachement d'un processus de son parent est incorrecte. Sous Linux, chaque processus a un processus parent et vous ne pouvez pas le modifier après sa création.
  • L'instruction "Je veux l'exécuter en tant que démon" n'est pas claire. Les processus démons sous Linux ont un PID parent et adhèrent à la règle parent-enfant.
  • Le problème de plantage du processus sous-jacent lorsque SIGTERM/SIGKILL est envoyé à votre programme ne peut pas être reproduit avec la bibliothèque go-reap. .

Avis de non-responsabilité

La solution fournie se concentre sur la résolution du problème consistant à empêcher le sous-processus de devenir un zombie. Pour une solution complète répondant à toutes les exigences, une combinaison d’approches peut être nécessaire.

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