jms3000
Anmeldungsdatum: 29. Januar 2015
Beiträge: 800
Wohnort: Schwetzingen
|
Ich habe auf einem Intel NUC Homeassistant laufen, der Service läuft im Usermode. Und habe ich Nextcloud als Snap.
Beim Start des Rechners will Homeassistant auf Nextcloud zugreifen, aber das ist noch nicht fertig.
Kann ich da irgendwie eine Abhängigkeit definieren?
Nextcloud scheint keinen Service zu haben, aber es gibt einen snap.nextcloud.apache.service.
Wäre sowas dann ok?
[Unit]
Description=Home Assistant
# After=network-online.target
Wants=snap.nextcloud.apache
[Service]
Type=simple
# User=nuc
ExecStart=/home/nuc/.local/bin/hass
[Install]
WantedBy=default.target
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13938
|
jms3000 schrieb: Nextcloud scheint keinen Service zu haben, aber es gibt einen snap.nextcloud.apache.service.
Wäre sowas dann ok?
[Unit]
Description=Home Assistant
# After=network-online.target
Wants=snap.nextcloud.apache
dann versuch mal mit:
#Wants=snap.nextcloud.apache
Requires=snap.nextcloud.apache.service
After=snap.nextcloud.apache.service
Requires=systemd-time-wait-sync.service
After=systemd-time-wait-sync.service ... und nach der Änderung noch:
sudo systemctl daemon-reload
|
jms3000
(Themenstarter)
Anmeldungsdatum: 29. Januar 2015
Beiträge: 800
Wohnort: Schwetzingen
|
Leider langt es nicht darauf zu warten, dass Nextcloud gestartet wird. An sich müsste home assistant darauf warten, dass Nextcloud per REST-URL erreichbar ist. Aber das geht wohl nicht.
|
dingsbums
Anmeldungsdatum: 13. November 2010
Beiträge: 3553
|
An sich müsste home assistant darauf warten, dass Nextcloud per REST-URL erreichbar ist. Aber das geht wohl nicht.
Pragmatischer Ansatz: Den automatishen Start von Home Assistant deaktivieren (sudo systemctl disable <name.der.unit>). Ein kleines Shellskipt wird bei Start des Rechners /etc/crontab gestartet und prüft in einer Dauerschleife alle x Sekunden, ob die fragliche URL erreichbar ist. Sobald dies der Fall ist, wird Home Assistant gestartet.
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13938
|
dingsbums schrieb: Wenn so etwas erforderlich ist, haben m. E. die devs von systemd ihre Hausaufgaben (noch) nicht gemacht.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
Man kann bei Systemd zwischen System Units und User Units keine Abhängigkeiten definieren (mit Upstart ging das) - ich würde mal versuchen das per Socket Activation für die snap.nextcloud.apache zu lösen.
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13938
|
seahawk1986 schrieb: Man kann bei Systemd zwischen System Units und User Units keine Abhängigkeiten definieren ...
Der TE hat ja keine user-unit. Der user ist kommentiert.
# User=nuc
Man kann aber services (Dienste) für den Usermode, mit Hilfe einer systemd unit (d. h. als root) starten. Z. B.:
murmurd 586 mumble-server 12u IPv4 14930 0t0 TCP ...
murmurd 586 mumble-server 13u IPv4 14931 0t0 UDP ...
ample 19497 nobody 1u IPv4 284727 0t0 UDP ...
ample 19497 nobody 2u IPv4 284728 0t0 TCP ...
stunnel4 542 stunnel4 13u IPv4 16582 0t0 TCP ...
... und damit kann man Abhängigkeiten definieren.
|
jms3000
(Themenstarter)
Anmeldungsdatum: 29. Januar 2015
Beiträge: 800
Wohnort: Schwetzingen
|
seahawk1986 schrieb: Man kann bei Systemd zwischen System Units und User Units keine Abhängigkeiten definieren (mit Upstart ging das) - ich würde mal versuchen das per Socket Activation für die snap.nextcloud.apache zu lösen.
Aha, vielleicht ist das das Problem. Der Home Assistant läuft als user service (--user), ich weiss nicht mehr warum das nötig war.
In dem Fall wird die Abhängigkeit ignoriert?
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13938
|
jms3000 schrieb: ... Der Home Assistant läuft als user service (--user), ...
Wird der Home Asistent auch mit einer user-service-unit gestartet? Oder was ist bei dir, der Unterschied ziwschen "user service" und "user unit"? EDIT: Siehe auch: https://wiki.ubuntuusers.de/systemd/User_Units/#Interaktion-mit-System-Units In der Standardkonfiguration werden User Units erst gestartet, wenn alle System Units bereits laufen,
weil sich der Nutzer erst anmelden kann, wenn das System komplett gestartet ist. Von daher machen
Direktiven wie After=... auf bestimmte Units oder Targets, die beim Starten des Systems abgearbeitet
werden, in der Regel keinen Sinn.
|
jms3000
(Themenstarter)
Anmeldungsdatum: 29. Januar 2015
Beiträge: 800
Wohnort: Schwetzingen
|
Die Service-Datei liegt unter "/home/nuc/.config/systemd/user/homeassistant.service". Und wenn ich manuell starte dann mit "systemctl start --user homeassistant". Der User "nuc" wird aber automatisch angemeldet beim Systemstart.
Wenn aber sowieso erst alle System-Units gestartet werden bevor User-Units gestartet werden, dann macht ja eine Warterei keinen Sinn.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
lubux schrieb: Siehe auch: https://wiki.ubuntuusers.de/systemd/User_Units/#Interaktion-mit-System-Units In der Standardkonfiguration werden User Units erst gestartet, wenn alle System Units bereits laufen,
weil sich der Nutzer erst anmelden kann, wenn das System komplett gestartet ist. Von daher machen
Direktiven wie After=... auf bestimmte Units oder Targets, die beim Starten des Systems abgearbeitet
werden, in der Regel keinen Sinn.
Ich hätte das nicht so absolut formuliert - was bei Desktop-Systemen passiert ist, dass das graphical-target nach dem multi-user.target angestrebt wird, wodurch es eine gewisse Reihenfolge gibt - das funktioniert aber nur, wenn Systemd weiß, wann ein von ihm gestartetes Programm betriebsbereit ist - dafür gibt es z.B. Mechanismen über sd-notify (vgl. https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=), mit deren Hilfe der gestartete Prozess sagen kann, dass er die Initialisierungsphase durchlaufen hat und jetzt voll funktionsfähig ist. Wenn das zu schwammig definiert ist, kann es passieren, dass Systemd den Zustand, dass das Programm zwar schon gestartet wurde, aber eben noch nicht bereit ist Verbindungen von Clients zu verarbeiten, als "running" statt als "starting" ansieht und dann davon abhängige bzw. nachgeordnete Units zu früh gestartet werden. Bei Programmen, die nur ein Sys-V Init Skript mitbringen, für das dann durch systemd-sysv-generator dynamisch eine Unit erzeugt wird, ist das immer ein potentielles Problem (und oft ist Systemd nicht in der Lage den gestarteten Prozess korrekt zu tracken) - wie das beim Nextcloud Snap im Detail umgesetzt ist, habe ich mir noch nicht angesehen.
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13938
|
jms3000 schrieb: Wenn aber sowieso erst alle System-Units gestartet werden bevor User-Units gestartet werden, dann macht ja eine Warterei keinen Sinn.
Ja, macht m. E. keinen Sinn. Wie sind vor dem manuellen Starten deiner user-service-unit, die Ausgaben von:
systemctl status snap.nextcloud.apache.service
systemctl list-units --all | grep -i nextcloud
?
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13938
|
seahawk1986 schrieb: Bei Programmen, die nur ein Sys-V Init Skript mitbringen, für das dann durch systemd-sysv-generator dynamisch eine Unit erzeugt wird, ist das immer ein potentielles Problem (und oft ist Systemd nicht in der Lage den gestarteten Prozess korrekt zu tracken) - wie das beim Nextcloud Snap im Detail umgesetzt ist, habe ich mir noch nicht angesehen.
BTW: Man kann mit Hilfe von drop-in-Dateien (ergänzende config-Datei), auch die vom systemd-sysv-generator dynamisch erzeugte Unit, optimieren bzw. ergänzen/"verändern".
|
jms3000
(Themenstarter)
Anmeldungsdatum: 29. Januar 2015
Beiträge: 800
Wohnort: Schwetzingen
|
lubux schrieb: Wie sind vor dem manuellen Starten deiner user-service-unit, die Ausgaben von:
systemctl status snap.nextcloud.apache.service
systemctl list-units --all | grep -i nextcloud
?
Homeassistant wird ja automatisch als user unit gestartet. Manuell starte ich das nur, wenn ich es manuell gestoppt hatte.
Ich vermute dass Nextcloud nach dem Starten einfach ein paar Sekunden rumrödelt, bis die URL zur Verfügung steht.
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13938
|
jms3000 schrieb: Homeassistant wird ja automatisch als user unit gestartet. Manuell starte ich das nur, wenn ich es manuell gestoppt hatte.
Ich vermute dass Nextcloud nach dem Starten einfach ein paar Sekunden rumrödelt, bis die URL zur Verfügung steht.
D. h. wenn Du die user-service-unit, z. B. 60 Sekunden nach dem booten manuell startest, gibt es keine Probleme mit dem Homeasistent?
Wenn ja, dann versuch mal mit deaktivierter user-service-unit und starte diese mit Hilfe einer timer-unit (60 Sekunden nach dem booten).
|