Wie führe ich einen lang laufenden Prozess in Go aus und trenne ihn vom übergeordneten Prozess?

Linda Hamilton
Freigeben: 2024-10-29 18:31:43
Original
225 Leute haben es durchsucht

How to Run a Long-Running Process in Go and Detach It from the Parent Process?

Einen Befehl in Go ausführen und vom Prozess trennen

Problem

Ich muss einen lang andauernden Prozess in Go ausführen und dabei das erfüllen Folgende Anforderungen:

  1. Standardausgabe des Prozesses in eine Datei umleiten.
  2. Kontrollieren Sie den Benutzer des Prozesses.
  3. Stellen Sie sicher, dass der Prozess fortgesetzt wird, nachdem mein Programm beendet wurde.
  4. Verhindern Sie, dass der Prozess zu einem Zombie wird, wenn er abstürzt.
  5. Erhalten Sie die PID des laufenden Prozesses.

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.

Lösung

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:

  1. Standardausgabe umleiten: Verwenden Sie cmd.Stdout = stdLogFile, um die Standardausgabe des Prozesses in eine angegebene Datei umzuleiten .
  2. Benutzer steuern: Legen Sie cmd.SysProcAttr = &syscall.SysProcAttr{Credential: &syscall.Credential{Uid: uid}} fest, um den Benutzer des Prozesses zu steuern.
  3. Vom Prozess trennen: Führen Sie den Befehl in einer separaten Goroutine mit go func() { cmd.Wait() }() aus, um zu verhindern, dass er zu einem Zombie wird.
  4. PID abrufen: Verwenden Sie cmd.Process.Pid, um die PID des laufenden Prozesses abzurufen.

Hinweis

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!

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