Depuis quelques mois, nous avons un serveur coturn installé depuis les dépôts Debian GNU/Linux. Implémentation de TURN, l'un des nombreux palliatifs pour tenter de faire fonctionner des logiciels multimédias pair-à-pair avec du NAT au milieu.
Ce service se vautre plusieurs fois par semaine. Évidemment, rien dans son journal. Sauf aujourd'hui : segfault. Mes recherches sur le web retournent rien (ou des paths vieux de 5-7 ans, qui ont donc été intégré depuis, en ce qui concerne l'erreur de segmentation). On pourrait lancer coturn en mode ultra-verbeux (« -V »), sortir gdb
(pour la segfault), etc. Mais en attendant ?
Pour ces cas-là, systemd propose Restart=on-failure
, c'est-à-dire redémarrer un service à chaque fois qu'il crashe.
J'utilise ça dans des units systemd depuis plus de 5 ans. Mais, dans Debian, coturn est livré avec un script sysv qui utilise start-stop-daemon
. Est-ce que ça fonctionne ? Oui.
Utiliser la commande systemctl edit coturn.service
.
Saisir :
[Service]
RemainAfterExit=no
Restart=on-failure
RestartSec=10s
Enregistrer.
Désormais, systemctl status coturn
affiche deux lignes supplémentaires : « Drop-In: /etc/systemd/system/coturn.service.d / override.conf ».
« RemainAfterExit » est nécessaire, sinon systemd ne fait pas le job.
« RestartSec » n'est pas nécessaire mais laisse un peu de répit à coturn pour démarrer et éviter une boucle de redémarrage (systemd essaye de faire redémarrer un service en boucle, jusqu'à une limite pré-définie et surchargeable, après quoi il laisse le service HS, ce que je ne veux pas).
Si l'on veut tester, on remplace « on-failure » par « always » puis killall coturn
.