Maison > développement back-end > Golang > Comment puis-je empêcher systemd de tuer les processus enfants lorsque le processus parent se termine ?

Comment puis-je empêcher systemd de tuer les processus enfants lorsque le processus parent se termine ?

Barbara Streisand
Libérer: 2024-12-21 04:57:09
original
734 Les gens l'ont consulté

How can I prevent systemd from killing child processes when the parent process terminates?

Gestion des processus enfants dans Systemd : résolution des problèmes de détachement des processus

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())
    }
}
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal