it-swarm.com.de

Dienste bleiben nach dem Stoppen mit systemctl im Status "Fehlgeschlagen"

wir haben ein einfaches systemd-Skript, um einen MineCraft-Server auf Service-Weise zu starten. Das SO ist CentOS 7. Hier das Skript:

[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

Das Starten des Dienstes funktioniert einwandfrei, aber beim Beenden bleibt der Dienst in einem fehlgeschlagenen Zustand. Sehen:

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)

Irgendeine Idee?

Vielen Dank

19
kalise

Der Exit-Code 143 bedeutet, dass das Programm ein SIGTERM-Signal empfangen hat, um es zum Beenden anzuweisen, das Signal jedoch nicht richtig verarbeitet hat. Dies ist fast immer auf Programmierfehler zurückzuführen und tritt häufig bei Java - Anwendungen aller Art auf.

Sie sollten dies unterdrücken können, indem Sie den Exit-Code als "Erfolg" -Exit-Status in die Gerätedatei einfügen:

[Service]
SuccessExitStatus=143
27
Michael Hampton

Um Michaels Antwort zu ergänzen, ist der Exit-Code 143 hier normal. Auf diese Weise hat Java VM ein SIGTERM-Signal empfangen, das von systemd gesendet wurde, um den Prozess zu stoppen. Das SIGTERM-Signal hat einen numerischen Wert von 15 (siehe man signal).

Gemäß der Posix-Spezifikation wird nun "Der Beendigungsstatus eines Befehls, der beendet wurde, weil er ein Signal empfangen hat, als größer als 128 gemeldet". ( http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_08_02 )

Hier addiert das Java VM 128 + 15 und Sie erhalten diesen Exit-Code von 143.

Dieser Exit-Code ungleich Null ist hier sinnvoll, da Sie sehen können, dass Ihr Java - Programm aufgrund eines externen Signals beendet wurde, und Sie die Möglichkeit haben, herauszufinden, welches Signal vorhanden ist.

11
Manu