MQTT, Mosquitto, Raspbian Jessie und der fiese Systemd-Autostart

MQTT, Mosquitto, Raspbian Jessie und der fiese Systemd-Autostart

Disclaimer: Ich hab keine Linuxerfahrung. Mit Google an meiner Seite, bekomme ich Dinge hin, die ich meistens nur halb verstehe. Also falls ich Blödsinn erzähle, bin ich dankbar für einen Hinweis.

Immer wieder wenn ich bastle, sehen die Anleitungen super leicht aus – es dauert dann aber doch einen Tag bis alles läuft. Nicht anders war es bei meiner Mosquitto Installation. Die Hürde: kein Autostart.

Meine Mosquitto-Config ist simpel und sie sieht wie folgt aus:

# Config file for mosquitto
#
# See mosquitto.conf(5) for more information.
#
# Default values are shown, uncomment to change.
#
# Use the # character to indicate a comment, but only if it is the
# very first character on the line.

# =================================================================
# General configuration
# =================================================================


# Write process id to a file. Default is a blank string which means
# a pid file shouldn't be written.
# This should be set to /var/run/mosquitto.pid if mosquitto is
# being run automatically on boot with an init script and
# start-stop-daemon or similar.
pid_file /var/run/mosquitto.pid

# When run as root, drop privileges to this user and its primary
# group.
# Leave blank to stay as root, but this is not recommended.
# If run as a non-root user, this setting has no effect.
# Note that on Windows this has no effect and so mosquitto should
# be started by the user you wish it to run as.
user mosquitto

# =================================================================
# Persistence
# =================================================================

# Save persistent message data to disk (true/false).
# This saves information about all messages, including
# subscriptions, currently in-flight messages and retained
# messages.
# retained_persistence is a synonym for this option.
persistence false

Warum ich die Persistence ausgeschaltet hab, hat mit meinem Autostart-Problemen zu tun – später mehr dazu. (Hier findet sich eine komplette Beispiel-Config und hier die offizielle Hilfeseite.)

Nachdem ich auf Facebook den freundlichen Hinweis bekommen hab, dass Jessie vielleicht nicht mehr die init.d Skripte nutzt sondern Systemd, war ein viertel Tag wilden Rumsuchens verstrichen. Auf zu Google, die erst beste Seite aufgerufen und es funktioniert nicht. Um eine lange Geschichte kurz zu machen, umreiße ich hier kurz die Konfiguration, die bei mir läuft. Vielleicht hilft es ja jemandem Zeit zu sparen.

Unter < /etc/systemd/system/> die Datei „mosquitto.service“ mit folgendem Inhalt anlegen:

[Unit]
Description=Mosquitto MQTT Broker daemon
ConditionPathExists=/etc/mosquitto/mosquitto.conf
Wants=multi-user.target
After=multi-user.target
Requires=network.target

[Service]
Type=simple
ExecStart=/usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf -d
ExecReload=/bin/kill -HUP $MAINPID
PIDFile=/run/mosquitto.pid
Restart=on-failure

[Install]
WantedBy=multi-user.target

Wichtig hierbei (hat mich auch einige Zeit gekostet *facepalm*): unter „ExecStart“ den Pfad auf euren Installationsort legen.
Ich habe eine fixe IP per dhcpcd eingestellt, die wird erst ganz am Ende des Startvorgangs aktiviert. Damit Mosquitto erst danach – also mit Netzwerkverbindung – startet, habe ich die Zeilen Wants=multi-user.target und After=multi-user.target hinzugefügt.

Um das Skript zu aktivieren nutzt man die Befehle:
sudo systemctl enable mosquitto
sudo systemctl start mosquitto
systemctl status mosquitto

Nun könnte es sein, dass alles funktioniert. Tat es aber bei mir nicht.

Nach dem Start sagt <systemctl status mosquitto> das „Start-limit“ sei erreicht, bedeutet, es wurde mehrfach erfolglos versucht den MQTT-Deamon zu startet und weitere Startversuche blockiert.
Mit <tail -n 200 /var/log/syslog> kann man nachlesen, was beim Start passiert ist.

Bei mir war das Problem, dass er auf  </var/lib/mosquitto/> und die Datei „mosquitto.db“  nicht zugreifen kann. Die Rechte mit chmod auf 775 zu setzten und mit chown den Benutzer auf mosquitto zu wechseln, hat keine Frucht getragen. Also die Datei „mosquitto.db“ einfach gelöscht.

Autostart läuft.

Etwas später hab ich nochmal in den Log geguckt und festgestellt, dass Mosquitto stündlich versucht seine in-memory Datenbank in </var/lib/mosquitto/mosquitto.db> zu schreiben, aber nicht zugreifen kann „No such file or directory“. Die Rechte stimmen (glaube ich), die Datei hat sich sogar wieder angelegt. Da ich die Persistence nicht benötige, hab ich sie einfach abgeschaltet.

Jetzt scheint wirklich alles zu laufen wie es soll.

Auf zum nächsten Problem: Autostart von Openhab mit systemd. Klingt wieder einfach, ist aber zickig.

 

Venedig – Tag 14: Der Dogenpalast und Rumgerenne
Lösung zu: The Octoprint server is currently not running

Trackbacks/Pingbacks

  1. MQTT - markus.jabs.name - […] am 2017-07-13] [3] fhem-forum [abge­ru­fen am 2017-07-13] [4] nicht mehr not­wen­dig [5] Ilan Koch [abge­ru­fen am […]

Kommentar verfassen