J'ai installé des ddns dynamiques sans adresse IP en suivant ce guide: https://www.noip.com/support/knowledgebase/installing-the-linux-dynamic-update-client/
Je fais fonctionner le service par
Sudo /usr/local/bin/noip2
Cependant, je veux que le service démarre au démarrage, j'ai essayé d'ajouter le script suivant à /etc/init.d/noip2.sh
#######################################################
#! /bin/sh
# . /etc/rc.d/init.d/functions # uncomment/modify for your killproc
case "$1" in
start)
echo "Starting noip2."
/usr/local/bin/noip2
;;
stop)
echo -n "Shutting down noip2."
killproc -TERM /usr/local/bin/noip2
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
#######################################################
Suivi par:
Sudo chmod +x /etc/init.d/noip2.sh
Sudo update-rc.d noip2.sh defaults
Maintenant, je devrais pouvoir démarrer le service avec
Sudo service noip2 start
Mais je ne suis pas. Lorsque je lance journalctl -xe
, je reçois les informations suivantes:
-- Unit noip2.service has begun starting up.
Nov 03 12:36:11 media systemd[3111]: noip2.service: Failed to execute command: Exec format error
Nov 03 12:36:11 media systemd[3111]: noip2.service: Failed at step EXEC spawning /etc/init.d/noip2.sh: Exec format error
-- Subject: Process /etc/init.d/noip2.sh could not be executed
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
--
-- The process /etc/init.d/noip2.sh could not be executed and failed.
--
-- The error number returned by this process is 8.
Nov 03 12:36:11 media systemd[1]: noip2.service: Control process exited, code=exited status=203
Nov 03 12:36:11 media systemd[1]: noip2.service: Failed with result 'exit-code'.
Nov 03 12:36:11 media systemd[1]: Failed to start noip2.service.
-- Subject: Unit noip2.service has failed
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
Informations mises à jour pour l'utilisateur PerDuck: je reçois les erreurs suivantes en essayant votre solution ... :( J'ai essayé d'ajouter
RestartSec=30
Au moins, il continue d'essayer mais il ne commence toujours pas. Je peux toujours le démarrer avec Sudo/usr/local/bin/noip2
Les erreurs:
Nov 03 23:26:42 media systemd[1]: noip2.service: Service hold-off time over, scheduling restart.
Nov 03 23:26:42 media systemd[1]: noip2.service: Scheduled restart job, restart counter is at 5.
Nov 03 23:26:42 media systemd[1]: Stopped noip2 service.
Nov 03 23:26:42 media systemd[1]: noip2.service: Start request repeated too quickly.
Nov 03 23:26:42 media systemd[1]: noip2.service: Failed with result 'start-limit-hit'.
Nov 03 23:26:42 media systemd[1]: Failed to start noip2 service.
Depuis Ubuntu 15.04, le moyen standard de contrôler les processus d’arrière-plan (et bien d’autres encore) est systemd
. Je suggère de passer de votre script init.d
à un systemd
nité:
Créez le fichier /etc/systemd/system/noip2.service
avec le contenu suivant (et déposez vos scripts init.d
):
[Unit]
Description=noip2 service
[Service]
Type=forking
ExecStart=/usr/local/bin/noip2
Restart=always
[Install]
WantedBy=default.target
Puis émettre
Sudo systemctl daemon-reload
pour rendre systemd
conscient de la nouvelle unité (systemd
met en cache les fichiers d'unité et cette commande permet à systemd
de revoir son cache).
Vous pouvez maintenant essayer de démarrer et d’arrêter votre nité et voir son statut:
Sudo systemctl status noip2
Sudo systemctl start noip2
Sudo systemctl status noip2
Sudo systemctl stop noip2
Sudo systemctl status noip2
Pour que l’appareil démarre au démarrage, vous devez enable it:
Sudo systemctl enable noip2
Pour désactiver le démarrage automatique au démarrage, vous devez désactiver l'unité:
Sudo systemctl disable noip2
La plupart du temps, cinq commandes suffisent pour contrôler le comportement d'unités:
systemctl start $unit # starts a unit NOW
systemctl stop $unit # stops a unit NOW
systemctl status $unit # shows status
systemctl enable $unit # starts a unit at boot time (but not NOW)
systemctl disable $unit # stops autostart (but doesn't stop the unit NOW)
Vous pouvez également activer le démarrage automatique et démarrer l'unité immédiatement ou désactiver le démarrage automatique et l'arrêter immédiatement:
systemctl enable --now $unit # enable and start in one go
systemctl disable --now $unit # disable and stop in one go
Certaines recherches ont révélé que le noip2
s'exécute en tant que démon, c'est-à-dire que lorsque vous le démarrez, il crée un autre processus qui s'exécute en arrière-plan (ainsi appelé forking) et au premier plan processus retourne immédiatement (sorties). C'est pourquoi le script init.d et l'unité systemd ont échoué: ils ont lancé noip2
simplement pour le voir se fermer immédiatement. Par conséquent, systemd a essayé de le redémarrer encore et encore sans succès. (Par défaut, systemd redémarre un processus au plus 5 fois en 10 secondes environ avant d'abandonner et de le laisser en état d'échec.)
Pour indiquer à systemd que l'unité est de type forking ajouter la ligne
Type=forking
à la section [Service]
comme je viens de le faire dans l'extrait ci-dessus. Cela indique à systemd de attendre le processus principal doit être immédiatement renvoyé, mais au lieu de cela, il regarde le processus engendré (forké) par noip2
.