J'ai écrit quelques fichiers de service utilisateur systemd que je souhaite que les utilisateurs activent et qui nécessitent une connexion réseau fonctionnelle. J'ai pensé que ce serait aussi simple que:
Wants=network-online.target
After=network-online.target
Cependant, les services semblent commencer trop tôt, et journalctl
je vois:
network-online.target: Cannot add dependency job, ignoring: Unit network-online.target failed to load: No such file or directory.
Ensuite, j'ai cherché plus et essayé
Wants=network.target
After=network.target
et l'a fait sudo systemctl enable systemd-networkd-wait-online.service
.
Maintenant, j'ai journalctl
:
network.target: Cannot add dependency job, ignoring: Unit network.target failed to load: No such file or directory.
Et encore une fois, le service commence trop tôt.
Ce message est-il censé être là? Comment puis-je déboguer mon problème?
EDIT : la raison est simple et spécifiquement indiquée dans l' Arch Wiki :
systemd --user
s'exécute en tant que processus distinct dusystemd --system
processus. Les unités utilisateur ne peuvent pas référencer ou dépendre des unités système.
Ce message de forum semble suggérer une solution simple: je devrais link
l'unité système nécessaire en tant qu'utilisateur, créant ainsi un lien symbolique vers celui-ci disponible sur le chemin de recherche de l'unité.
Après cela, je ne vois aucun No such file or directory
message, cependant, je ne peux toujours pas faire fonctionner les services une fois le réseau en ligne. J'ai essayé liaison network.target
, network-online.target
et systemd-networkd-wait-online.service
, la mise en mes unités à dépendre de chacun d'eux, sans succès. Lorsque je vérifie l'état de l'unité liée en mode utilisateur, ils sont tous certains morts, par exemple:
$ systemctl --user status network.target
● network.target - Network
Loaded: loaded (/usr/lib/systemd/system/network.target; linked; vendor preset: enabled)
Active: inactive (dead)
Docs: man:systemd.special(7)
http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
$ systemctl status network.target
● network.target - Network
Loaded: loaded (/usr/lib/systemd/system/network.target; static; vendor preset: disabled)
Active: active since Sat 2015-07-18 19:20:11 MSK; 3h 35min ago
Docs: man:systemd.special(7)
http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
Jul 18 19:20:11 calc-server systemd[1]: Reached target Network.
Jul 18 19:20:11 calc-server systemd[1]: Starting Network.
Cependant, je peux voir network-online.target
actif en mode utilisateur après l'avoir lié:
$ systemctl --user status network-online.target
● network-online.target - Network is Online
Loaded: loaded (/usr/lib/systemd/system/network-online.target; linked; vendor preset: enabled)
Active: active since Sun 2015-07-19 00:35:38 MSK; 2min 48s ago
Docs: man:systemd.special(7)
http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
Jul 19 00:35:38 calc-server systemd[469]: Reached target Network is Online.
Jul 19 00:35:38 calc-server systemd[469]: Starting Network is Online.
la source
Réponses:
Comme vous ne pouvez pas dépendre d'un service système, votre seule solution est de fournir un service utilisateur qui détecte si le réseau est en ligne. (Ou faites en sorte que votre système de services devienne un service.) Les détails d'un service utilisateur "détecter en ligne" dépendraient de votre définition de "en ligne". Il pourrait par exemple attendre qu'un ping vers 8.8.8.8 réussisse. Ou pour qu'une résolution de nom DNS réussisse. Par exemple, dans une situation similaire avec vpnc, j'attends qu'un ping vers une IP vpn réussisse.
Ensuite, vous pouvez faire dépendre vos services utilisateurs de (After =) votre service utilisateur de détection en ligne.
la source
Je recommanderais de tester quelque chose comme ceci:
Suivi par:
la source