Ich habe ein paar systemd-Benutzerdienstdateien geschrieben, die Benutzer aktivieren sollen und die eine funktionierende Netzwerkverbindung benötigen. Ich dachte, das wäre so einfach wie:
Wants=network-online.target
After=network-online.target
Die Dienste scheinen jedoch zu früh zu starten, und journalctl
ich sehe:
network-online.target: Cannot add dependency job, ignoring: Unit network-online.target failed to load: No such file or directory.
Dann suchte ich weiter und versuchte es
Wants=network.target
After=network.target
und tat sudo systemctl enable systemd-networkd-wait-online.service
.
Jetzt habe ich in journalctl
:
network.target: Cannot add dependency job, ignoring: Unit network.target failed to load: No such file or directory.
Und wieder startet der Service zu früh.
Soll diese Botschaft da sein? Wie kann ich mein Problem beheben?
BEARBEITEN : Der Grund ist einfach und speziell im Arch Wiki angegeben :
systemd --user
läuft als separater Prozess vomsystemd --system
Prozess ab. Benutzereinheiten können nicht auf Systemeinheiten verweisen oder von diesen abhängen.
Dieser Forumsbeitrag scheint eine einfache Lösung vorzuschlagen: Ich sollte link
die nötige Systemeinheit als Benutzer anlegen und somit einen Symlink dazu auf dem Einheitensuchpfad zur Verfügung stellen.
Danach werden keine No such file or directory
Nachrichten mehr angezeigt. Ich kann die Dienste jedoch immer noch nicht ausführen, nachdem das Netzwerk online ist. Ich habe versucht network.target
, meine Einheiten zu verknüpfen network-online.target
und so systemd-networkd-wait-online.service
einzustellen, dass sie von jeder von ihnen abhängen, ohne Erfolg. Wenn ich den Status der verknüpften Einheit im Benutzermodus überprüfe, sind alle tot, z. B .:
$ 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.
Ich kann network-online.target
jedoch im Benutzermodus nach dem Verknüpfen Folgendes sehen:
$ 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.
quelle
Antworten:
Da Sie sich nicht auf einen Systemdienst verlassen können, besteht Ihre einzige Lösung darin, einen Benutzerdienst bereitzustellen, der erkennt, ob das Netzwerk online ist. (Oder machen Sie Ihre Dienste zu Systemdiensten.) Details für einen "online erkennen" -Benutzerdienst hängen von Ihrer Definition von "online" ab. Es könnte beispielsweise warten, bis ein Ping auf 8.8.8.8 erfolgreich war. Oder für eine erfolgreiche DNS-Namensauflösung. In einer ähnlichen Situation mit vpnc warte ich beispielsweise darauf, dass ein Ping an eine vpn-IP erfolgreich ist.
Dann können Sie Ihre Benutzerdienste von (After =) Ihrem Onlineerkennungsdienst abhängig machen.
quelle
Ich würde empfehlen, so etwas zu testen:
Gefolgt von:
quelle