Heim > Backend-Entwicklung > Golang > Wie kann ich verhindern, dass systemd untergeordnete Prozesse beendet, wenn der übergeordnete Prozess beendet wird?

Wie kann ich verhindern, dass systemd untergeordnete Prozesse beendet, wenn der übergeordnete Prozess beendet wird?

Barbara Streisand
Freigeben: 2024-12-21 04:57:09
Original
737 Leute haben es durchsucht

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

Umgang mit untergeordneten Prozessen in Systemd: Lösen von Prozessablösungsproblemen

Beim Erzeugen lang laufender untergeordneter Prozesse ist es entscheidend, deren Überleben über die Lebensdauer des Hauptprozesses hinaus sicherzustellen. insbesondere wenn es von systemd verwaltet wird. In einigen Szenarien können untergeordnete Prozesse unerwartet beendet werden, sodass wichtige Hintergrundaufgaben nicht bearbeitet werden.

Bedenken Sie das folgende Problem, das beim Versuch aufgetreten ist, einen Hauptprozess zu erstellen, der untergeordnete Prozesse mit der Programmiersprache go startet:

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())
    }
}
Nach dem Login kopieren

Beim Ausführen dieses Programms über das Terminal bleibt der untergeordnete Prozess bestehen, auch nachdem der Hauptprozess gestoppt oder beendet wurde (Strg Z und kill -INT 7914). Wenn der Hauptprozess jedoch als systemd-Dienst gestartet wird, wird auch der untergeordnete Prozess abrupt beendet.

Um dieses Problem zu beheben, ändern Sie die systemd-Dienstdatei (/etc/systemd/system/exectest.service) durch Hinzufügen die folgende Zeile:

KillMode=process
Nach dem Login kopieren

Diese Einstellung weist systemd an, nur den Hauptprozess zu beenden, sodass die untergeordneten Prozesse weiter ausgeführt werden können. Standardmäßig verwendet systemd den Kontrollgruppenmodus, der alle Prozesse innerhalb derselben Kontrollgruppe wie der Hauptprozess beendet.

Die aktualisierte Systemd-Dienstdatei:

[Unit]
Description=ExecTest

[Service]
Type=simple
ExecStart=/home/snowm/src/exectest/exectest
User=snowm
KillMode=process

[Install]
WantedBy=multi-user.target
Nach dem Login kopieren

Mit dieser Änderung wird die Untergeordnete Prozesse überleben die Beendigung des Hauptprozesses und gewährleisten so die Stabilität und Kontinuität der Hintergrundaufgaben.

Das obige ist der detaillierte Inhalt vonWie kann ich verhindern, dass systemd untergeordnete Prozesse beendet, wenn der übergeordnete Prozess beendet wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage