Lors de la génération de processus enfants de longue durée, il est crucial d'assurer leur survie au-delà de la durée de vie du processus principal, surtout lorsqu'il est géré par systemd. Dans certains scénarios, les processus enfants peuvent se terminer de manière inattendue, laissant les tâches critiques en arrière-plan non gérées.
Considérez le problème suivant rencontré lors de la tentative de création d'un processus principal qui démarre les processus enfants à l'aide du langage de programmation go :
package main import ( "log" "os" "os/exec" "syscall" "time" ) func main() { if len(os.Args) == 2 && os.Args[1] == "child" { for { time.Sleep(time.Second) } } else { cmd := exec.Command(os.Args[0], "child") cmd.SysProcAttr = &syscall.SysProcAttr{Setsid: true} log.Printf("child exited: %v", cmd.Run()) } }
Lors de l'exécution de ce programme depuis le terminal, le processus enfant persiste même après l'arrêt ou la fin du processus principal (Ctrl Z et kill -INT 7914). Cependant, lorsque le processus principal est démarré en tant que service systemd, le processus enfant se termine également brusquement.
Pour résoudre ce problème, modifiez le fichier du service systemd (/etc/systemd/system/exectest.service) en ajoutant la ligne suivante :
KillMode=process
Ce paramètre demande à systemd de tuer uniquement le processus principal, permettant aux processus enfants de continuer à s'exécuter. Par défaut, systemd utilise le mode groupe de contrôle, qui tue tous les processus du même groupe de contrôle que le processus principal.
Le fichier de service systemd mis à jour :
[Unit] Description=ExecTest [Service] Type=simple ExecStart=/home/snowm/src/exectest/exectest User=snowm KillMode=process [Install] WantedBy=multi-user.target
Avec cette modification, le les processus enfants survivront à la fin du processus principal, assurant la stabilité et la continuité des tâches en arrière-plan.
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!