La coppia che risolve l'80% dei casi:
systemctl status nome.service # stato, ultimo exit code, ultime righe
journalctl -xeu nome.service # il log completo della unit, spiegatoLeggi il motivo vero: exit code, Main PID exited, permessi, file mancanti, porta occupata. Il loop activating (auto-restart) è la unit con Restart=always che muore e riparte all'infinito: fermala con systemctl stop, debugga da ferma, e se serve respiro c'è systemctl reset-failed (azzera il contatore di StartLimit). Se il servizio parte a mano ma non da systemd, il sospetto è l'ambiente: PATH ridotto, working directory, variabili che nel tuo shell ci sono e nella unit no – si dichiarano nella unit (Environment=, WorkingDirectory=). Per lo script tuo da far partire al boot: una unit minima con [Install] WantedBy=multi-user.target e systemctl enable --now – le basi dei servizi systemd coprono il resto, e ricorda che restart riavvia il processo mentre reload gli chiede solo di rileggere la config: il secondo non butta giù niente.