Sua unidade de serviço do systemd é padronizada como Type=simple
, mas seu script de wrapper está usando a opção --daemon
. Essa é uma incompatibilidade de protocolo de prontidão. As incompatibilidades do protocolo de prontidão fazem com que os serviços não sejam iniciados corretamente ou (mais comumente) sejam (mal) diagnosticados pelo systemd como defeituosos.
O último está acontecendo aqui. Porque você tem overengineered seu sistema, seu daemon é desnecessariamente bifurcando duas vezes sobre , e o processo errado é o processo de daemon real. Além disso, você está duplicando desnecessariamente a funcionalidade da unidade de serviço do systemd em seu script de wrapper.
Livre-se do script de shell do wrapper e escreva sua unidade de serviço assim:
[Unit] Description=Mosquitto MQTT Broker Documentation=man:mosquitto(8) Documentation=man:mosquitto.conf(5) ConditionPathExists=/home/root/mosquitto-1.4/mosquitto.conf After=xdk-daemon.service [Service] ExecStart=/home/root/mosquitto-1.4/src/mosquitto -p 1885 -c /home/root/mosquitto-1.4/mosquitto.conf ExecReload=/bin/kill -HUP $MAINPID User=mosquitto Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target
Observe que:
- Você não precisa da opção
--daemon
. O broker já é daemonized quando o systemd o executa. - Você não deve usar a opção
--daemon
. O Mosquitto não fala o protocoloforking
readiness, já que ele não está realmente pronto após o fork-and-exit. (Vivemos na esperança de que as pessoas um dia escrevam programas como esse, de modo que possam herdar seus soquetes de escuta e, portanto, sejam ativáveis por soquete). - Você não precisa mexer na saída e no erro padrão em um script de wrapper. O systemd irá lidar com a saída padrão e erro do daemon. Eles são configuráveis no arquivo da unidade de serviço, se realmente necessário, mas isso não parece necessário para este programa.
- Como o processo correto, identificável pelo systemd, agora é o processo do daemon,
systemctl reload mqtt.service
agora pode enviar um sinal para o lugar certo e trabalhar. - o próprio systemd chamará o intermediário como usuário
mosquitto
; Portanto, você precisa ter certeza de que existe uma conta de usuário com esse nome, com os direitos de acesso necessários. Observe o aviso no seu log. - O pessoal do systemd recomenda
on-failure
como a política de reinicialização acima dealways
. - Não se deve definir
DefaultDependencies
como falso, a menos que o daemon de alguém seja realmente capaz de rodar muito cedo no processo de inicialização e no final do processo de desligamento, o que geralmente não é o caso da maioria das coisas. As dependências da unidade de serviço padrão são apropriadas para este tipo de daemon.