Maison >développement back-end >Golang >Comment exécuter un processus de longue durée dans Go et le détacher du processus parent ?

Comment exécuter un processus de longue durée dans Go et le détacher du processus parent ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-29 18:31:43293parcourir

How to Run a Long-Running Process in Go and Detach It from the Parent Process?

Exécuter une commande dans Go et la détacher du processus

Problème

Je dois exécuter un processus de longue durée dans Go, répondant aux exigences exigences suivantes :

  1. Rediriger la sortie standard du processus vers un fichier.
  2. Contrôler l'utilisateur du processus.
  3. Assurer que le processus continue après la fermeture de mon programme.
  4. Empêchez le processus de devenir un zombie lorsqu'il plante.
  5. Obtenez le PID du processus en cours.

J'exécute mon programme avec les autorisations root et j'ai a tenté une solution en utilisant exec.Command() et syscall.SysProcAttr, mais elle échoue lorsque j'envoie SIGTERM/SIGKILL à mon programme, provoquant le crash du processus sous-jacent. Je souhaite exécuter le processus en tant que démon, distinct du contrôle de mon programme.

Solution

L'utilisation d'une bibliothèque externe, telle que github.com/hashicorp/go-reap, est fortement recommandée car cela résout efficacement le problème. Cependant, si vous préférez une implémentation personnalisée, l'approche suivante peut être envisagée :

  1. Redirect Standard Output : utilisez cmd.Stdout = stdLogFile pour rediriger la sortie standard du processus vers un fichier spécifié. .
  2. Contrôler l'utilisateur : définissez cmd.SysProcAttr = &syscall.SysProcAttr{Credential : &syscall.Credential{Uid : uid}} pour contrôler l'utilisateur du processus.
  3. Détacher du processus : exécutez la commande dans une goroutine distincte en utilisant go func() { cmd.Wait() }() pour l'empêcher de devenir un zombie.
  4. Obtenir le PID : utilisez cmd.Process.Pid pour obtenir le PID du processus en cours.

Remarque

Il est important de reconnaître qu'il est impossible de séparer complètement le processus parent et enfant en termes d'héritage de processus. Tous les processus doivent avoir un parent, et si le parent décède, l'enfant deviendra orphelin et sera adopté par le PID 1 (init). En d'autres termes, l'enfant ne peut pas avoir un parent différent de celui du processus initial qui l'a démarré.

Pour garantir que le processus continue de s'exécuter après la sortie du parent, envisagez d'utiliser un gestionnaire de processus dédié comme systemd ou docker, qui peut gérer processus orphelins et assurer leur exécution continue. D'autres solutions potentielles incluent l'écriture d'un démon personnalisé ou l'utilisation d'une bibliothèque comme go-daemon pour gérer le cycle de vie du processus indépendamment du programme parent.

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