web-dev-qa-db-fra.com

Impossible d'obtenir le service noip2 pour démarrer au démarrage

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.
2
Jesper.Lindberg

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 systemdnité:

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

Mise à jour

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.

2
PerlDuck