Ich muss einen lang andauernden Prozess in Go ausführen und dabei das erfüllen Folgende Anforderungen:
Ich führe mein Programm mit Root-Berechtigungen aus und habe Ich habe versucht, eine Lösung mit exec.Command() und syscall.SysProcAttr zu finden, aber sie schlägt fehl, wenn ich SIGTERM/SIGKILL an mein Programm sende, was zum Absturz des zugrunde liegenden Prozesses führt. Ich möchte den Prozess als Daemon ausführen, getrennt von der Steuerung meines Programms.
Die Verwendung einer externen Bibliothek wie github.com/hashicorp/go-reap wird dringend empfohlen Es löst das Problem effektiv. Wenn Sie jedoch eine benutzerdefinierte Implementierung bevorzugen, kann der folgende Ansatz in Betracht gezogen werden:
Es ist wichtig zu erkennen, dass es unmöglich ist, den Prozess vollständig zu trennen übergeordnete und untergeordnete Prozesse im Hinblick auf die Prozessvererbung. Alle Prozesse müssen ein übergeordnetes Element haben. Wenn das übergeordnete Element stirbt, wird das untergeordnete Element zu einer Waise und wird von PID 1 (init) adoptiert. Mit anderen Worten: Das untergeordnete Element kann keinen anderen übergeordneten Prozess haben als den ursprünglichen Prozess, der es gestartet hat.
Um sicherzustellen, dass der Prozess nach dem Beenden des übergeordneten Prozesses weiter ausgeführt wird, sollten Sie die Verwendung eines dedizierten Prozessmanagers wie systemd oder docker in Betracht ziehen, der dies verwalten kann verwaiste Prozesse und stellen deren weitere Ausführung sicher. Andere mögliche Lösungen umfassen das Schreiben eines benutzerdefinierten Daemons oder die Verwendung einer Bibliothek wie go-daemon, um den Lebenszyklus des Prozesses unabhängig vom übergeordneten Programm zu verwalten.
Das obige ist der detaillierte Inhalt vonWie führe ich einen lang laufenden Prozess in Go aus und trenne ihn vom übergeordneten Prozess?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!