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()) } }
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
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
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!