Maison >développement back-end >Golang >Comment définir dbus/systemd comme dépendance dans l'unité systemd

Comment définir dbus/systemd comme dépendance dans l'unité systemd

PHPz
PHPzavant
2024-02-12 09:10:21829parcourir

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

L'éditeur php Xiaoxin vous présentera comment définir DBus/Systemd comme dépendance de l'unité Systemd. DBus et Systemd sont deux outils couramment utilisés dans les systèmes d'exploitation Linux. DBus est utilisé pour la communication inter-processus, tandis que Systemd est responsable de l'initialisation du système et de la gestion des processus. La combinaison de DBus et Systemd peut permettre une gestion du système et une planification des ressources plus efficaces. Cet article expliquera en détail comment configurer DBus en tant que dépendance dans l'unité Systemd pour vous aider à mieux comprendre et appliquer l'utilisation de ces deux outils.

Contenu de la question

J'ai un petit programme écrit en go qui utilise la bibliothèque go-systemd pour interagir avec systemd via dbus.

Le programme lui-même est enregistré en tant qu'unité systemd et doit être démarré au démarrage. Lorsque le programme est en cours d'exécution, l'état de l'unité systemd de plusieurs unités sera régulièrement interrogé.

Maintenant, lorsque je démarre le programme manuellement, tout va bien. Cependant, lorsque systemd démarre après un redémarrage, il se "bloque", ce qui signifie qu'il ne pourra pas interroger l'état de l'unité systemd via dbus. Je recevrai le message suivant de la go-systemd bibliothèque :

process org.freedesktop.systemd1 exited with status 1

Maintenant, lorsque je redémarrerai le programme, il pourra immédiatement interroger les unités systemd sans erreur. Cela m'amène à supposer que mon programme a des dépendances défectueuses/mal configurées et donc une condition de concurrence critique au démarrage, empêchant le programme de communiquer avec systemd via dbus.

Maintenant, j'ai combiné cela avec quelques autres combinaisons, mais cela n'aide pas :

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

Comment dois-je configurer ma propre unité systemd (du programme go) pour qu'elle puisse communiquer avec systemd via dbus juste après le redémarrage ? Quelles dépendances dois-je configurer ?

Solution de contournement

Il semble que votre programme essaie de se connecter au bus DBus Session par défaut puisque vous dites qu'il fonctionne correctement lorsque vous l'exécutez manuellement. Lorsqu'une application est lancée à partir de Systemd, elle s'exécutera en tant que root par défaut et n'aura pas de bus de session auquel se connecter, elle échouera donc.

Lorsqu'un utilisateur se connecte sur un terminal graphique, le bus de session est généralement démarré connexion par connexion. Il ne démarrera pas par défaut lors de la connexion depuis le terminal.

Si tel est le cas, je vois actuellement que vous avez deux options :

  1. Utilisez le bus système au lieu du bus de session.
  2. Créez votre propre bus connecté, différent du bus de session et du bus système. Le moyen le plus simple est d'utiliser dbus-launch pour créer un nouveau bus auquel votre application peut se connecter.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer