web-dev-qa-db-fra.com

Les services restent en état d'échec après l'arrêt avec systemctl

nous avons un simple script systemd pour démarrer un serveur MineCraft de façon service. Le SO est CentOS 7. Voici le script:

[Unit]
Description=Minecraft Server
After=syslog.target network.target

[Service]
Type=simple
WorkingDirectory=/root/Minecraft
ExecStart=/bin/Java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui
Restart=on-failure

[Install]
WantedBy=multi-user.target

Le démarrage du service fonctionne correctement mais à l'arrêt, le service reste dans un état d'échec. Voir:

systemctl status minecraftd.service
minecraftd.service - Minecraft Server
   Loaded: loaded (/usr/lib/systemd/system/minecraftd.service; disabled)
   Active: active (running) since Mon 2015-06-01 16:00:12 UTC; 18s ago
 Main PID: 20975 (Java)
   CGroup: /system.slice/minecraftd.service
           └─20975 /bin/Java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui
systemctl stop minecraftd.service
systemctl status minecraftd.service
minecraftd.service - Minecraft Server
   Loaded: loaded (/usr/lib/systemd/system/minecraftd.service; disabled)
   Active: failed (Result: exit-code) since Mon 2015-06-01 16:01:37 UTC; 3s ago
  Process: 20975 ExecStart=/bin/Java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui (code=exited, status=143)
 Main PID: 20975 (code=exited, status=143)

Une idée?

Merci

19
kalise

Le code de sortie 143 signifie que le programme a reçu un signal SIGTERM pour lui demander de quitter, mais il n'a pas traité le signal correctement. Cela est presque toujours dû à des erreurs de programmation et est assez courant avec les applications Java de tous types).

Vous devriez pouvoir supprimer cela en ajoutant le code de sortie dans le fichier d'unité en tant qu'état de sortie "succès":

[Service]
SuccessExitStatus=143
27
Michael Hampton

Pour compléter la réponse de Michael, le code de sortie 143 est normal ici, c'est la façon dont le Java VM a reçu un signal SIGTERM, envoyé par systemd pour arrêter le Le signal SIGTERM a une valeur numérique de 15 (voir man signal).

Maintenant, selon la spécification Posix, "l'état de sortie d'une commande qui s'est terminée parce qu'elle a reçu un signal doit être signalé comme supérieur à 128". ( http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_08_02 )

Ici, le Java VM ajoute 128 + 15 et vous obtenez ce code de sortie de 143.

Ce code de sortie non nul ici a du sens, car cela permet de voir que votre programme Java a quitté à cause d'un signal externe, et vous avez la possibilité de savoir quel signal.

11
Manu