Heim >Backend-Entwicklung >Golang >So legen Sie dbus/systemd als Abhängigkeit in der Systemd-Einheit fest

So legen Sie dbus/systemd als Abhängigkeit in der Systemd-Einheit fest

PHPz
PHPznach vorne
2024-02-12 09:10:21823Durchsuche

如何将 dbus/systemd 设置为 systemd 单元中的依赖项

Der PHP-Editor Xiaoxin zeigt Ihnen, wie Sie DBus/Systemd als Abhängigkeit der Systemd-Einheit festlegen. DBus und Systemd sind zwei häufig verwendete Tools in Linux-Betriebssystemen. DBus wird für die Kommunikation zwischen Prozessen verwendet, während Systemd für die Systeminitialisierung und Prozessverwaltung verantwortlich ist. Durch die Kombination von DBus und Systemd kann eine effizientere Systemverwaltung und Ressourcenplanung erreicht werden. In diesem Artikel wird ausführlich erläutert, wie Sie DBus als Abhängigkeit in der Systemd-Einheit konfigurieren, damit Sie die Verwendung dieser beiden Tools besser verstehen und anwenden können.

Frageninhalt

Ich habe ein kleines Programm in go geschrieben, das die go-systemd-Bibliothek verwendet, um über dbus mit systemd zu interagieren.

Das Programm selbst ist als Systemd-Einheit registriert und sollte beim Booten gestartet werden. Wenn das Programm ausgeführt wird, wird der Systemd-Einheitsstatus mehrerer Einheiten regelmäßig abgefragt.

Wenn ich jetzt das Programm manuell starte, ist alles in Ordnung. Wenn systemd jedoch nach einem Neustart startet, bleibt es „hängen“, was bedeutet, dass es den Status der systemd-Einheit nicht über dbus abfragen kann. Ich erhalte folgende Nachricht von der go-systemd Bibliothek:

process org.freedesktop.systemd1 exited with status 1

Wenn ich jetzt das Programm neu starte, kann es sofort die Systemd-Einheiten ohne Fehler abfragen. Dies lässt mich vermuten, dass mein Programm fehlerhafte/falsch konfigurierte Abhängigkeiten und daher beim Start eine Race-Bedingung aufweist, die verhindert, dass das Programm über dbus mit systemd kommuniziert.

Jetzt habe ich das mit ein paar anderen Kombinationen zusammengestellt, aber es hilft nichts:

Requires=dbus.service
After=dbus.service
Wants=org.freedesktop.systemd1

Wie muss ich meine eigene Systemd-Einheit (des Go-Programms) konfigurieren, damit sie direkt nach dem Neustart mit Systemd über Dbus kommunizieren kann? Welche Abhängigkeiten muss ich konfigurieren?

Problemumgehung

Es hört sich so an, als würde Ihr Programm standardmäßig versuchen, eine Verbindung zum DBus-Sitzungsbus herzustellen, da Sie sagen, dass es einwandfrei funktioniert, wenn Sie es manuell ausführen. Wenn eine Anwendung von Systemd aus gestartet wird, wird sie standardmäßig als Root ausgeführt und verfügt über keinen Sitzungsbus, mit dem sie eine Verbindung herstellen kann, sodass sie fehlschlägt.

Wenn sich ein Benutzer an einem grafischen Terminal anmeldet, wird der Sitzungsbus normalerweise pro Anmeldung gestartet. Es wird standardmäßig nicht gestartet, wenn Sie sich über das Terminal anmelden.

Wenn dies der Fall ist, sehe ich derzeit zwei Möglichkeiten für Sie:

  1. Verwenden Sie den Systembus anstelle des Sitzungsbusses.
  2. Erstellen Sie Ihren eigenen verbundenen Bus, der sich vom Sitzungsbus und Systembus unterscheidet. Am einfachsten ist es, mit dbus-launch einen neuen Bus zu erstellen, mit dem sich Ihre Anwendung verbinden kann.

Das obige ist der detaillierte Inhalt vonSo legen Sie dbus/systemd als Abhängigkeit in der Systemd-Einheit fest. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen