Os serviços permanecem em estado de falha após serem interrompidos com systemctl

13

nós temos um script systemd simples para iniciar um servidor MineCraft de uma forma de serviço. O SO é o CentOS 7. Aqui o 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

Iniciar o serviço funciona bem, mas ao parar, o serviço permanece em estado de falha. Veja:

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)

Alguma ideia?

Obrigado

    
por kalise 01.06.2015 / 18:04

2 respostas

21

O código de saída 143 significa que o programa recebeu um sinal SIGTERM para instruir a saída, mas não lidou com o sinal corretamente. Isso é quase sempre devido a erros de programação e é bastante comum em aplicativos Java de todos os tipos.

Você deve ser capaz de suprimir isso adicionando o código de saída ao arquivo de unidade como um status de saída de "sucesso":

[Service]
SuccessExitStatus=143
    
por 01.06.2015 / 18:55
4

Para complementar a resposta de Michael, o código de saída 143 é normal aqui, é a maneira que a VM java recebeu um sinal SIGTERM, enviado pelo systemd para parar o processo. O sinal SIGTERM tem um valor numérico de 15 (veja man signal ).

Agora, de acordo com a especificação Posix, "O status de saída de um comando que foi encerrado porque recebeu um sinal deve ser reportado como maior que 128". ( link )

Aqui, a VM Java adiciona 128 + 15 e você obtém esse código de saída de 143.

Este código de saída não zero aqui faz sentido, já que isso permite ver que seu programa java saiu por causa de um sinal externo, e você terá a chance de descobrir qual sinal.

    
por 30.12.2017 / 11:34