Mosquitto, Debian & Systemd
I recently had this annoying issue with Mosquitto (a MQTT broker) that just wouldn't start.
The issue was simple - since version 2.x, Mosquitto will try to write a PID file which by default lives in /var/run/mosquitto/mosquitto.pid
(in previous versions it doesn't crash if it can't create this file). This is a tmpfs
drive so it resets with boot, and the Mosquitto user doesn't own the parent folder, so it can't create a subfolder in which it can store it's pid file.
The default systemd service definition for Mosquitto in Debian doesn't seem to create this folder before starting the service. The fix is simple, just place this file in /etc/systemd/system/mosquitto.service
, run systemctl daemon-reload
and restart the service with systemctl restart mosquitto.service
.
[Unit] Description=Mosquitto MQTT message broker Documentation=https://mosquitto.org/man/mosquitto-8.html After=network-online.target Wants=network-online.target systemd-networkd-wait-online.service [Service] Restart=on-failure RestartSec=2 User=mosquitto Group=mosquitto # Here's the important change ExecStartPre=+/bin/mkdir -m 740 -p /var/log/mosquitto ExecStartPre=+/bin/chown mosquitto:mosquitto /var/log/mosquitto ExecStartPre=+/bin/mkdir -m 740 -p /var/run/mosquitto ExecStartPre=+/bin/chown mosquitto:mosquitto /var/run/mosquitto ExecStart=/usr/sbin/mosquitto --config-file /etc/mosquitto/mosquitto.conf ExecReload=/bin/kill -HUP $MAINPID PrivateTmp=true PrivateDevices=true ProtectHome=true ProtectSystem=full [Install] WantedBy=multi-user.target
…and Bob's your uncle.
Update: I stole the unit file from this issue on GitHub.