使用systemctl停止服务后,服务仍处于失败状态


19

我们有一个简单的systemd脚本以服务方式启动MineCraft服务器。SO是CentOS7。这里的脚本:

[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

启动服务可以正常工作,但是在停止时,服务仍处于失败状态。看到:

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)

任何想法?

谢谢

Answers:


27

退出代码143表示程序接收到SIGTERM信号以指示其退出,但未正确处理该信号。这几乎总是由于编程错误引起的,并且在所有类型的Java应用程序中都很常见。

您应该能够通过将退出代码作为“成功”退出状态添加到单元文件中来抑制这种情况:

[Service]
SuccessExitStatus=143

有用。现在,服务处于预期的不活动状态。
Kalise

4
用Java应用程序处理信号的“正确”方式是什么?我能找到的最接近的是关机钩子,但是在文档中没有任何地方提到关机钩子会更改应用程序的退出代码。
SPoage '16

@SPoage stackoverflow.com/q/2975248/1068283但是,在这种情况下,即使存在关机钩子,Java似乎总是以代码143退出。
迈克尔·汉普顿

11

为了补充迈克尔的回答,这里的退出代码143很正常,这是Java VM接收SIGTERM信号的方式,由systemd发送以停止该过程。SIGTERM信号的数值为15(请参阅参考资料man signal)。

现在根据Posix规范,“由于收到信号而终止的命令的退出状态应报告为大于128”。(http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_08_02

Java VM在此处添加128 + 15,您将获得此退出代码143。

这里的非零退出代码很有意义,因为这可以看到您的Java程序由于外部信号而退出,并且您有机会找出哪个信号。


所引用的POSIX规范文本似乎是在指定Shell的行为方式,并显示“ Shell是命令语言解释器”。Java VM似乎未包含在该规范中。Shell如何解释由于SIGTERM而终止的Java VM(或任何其他程序)-它应该将退出代码设置为143-确实包含在规范中,但是我很确定这里没有Shell。
doshea

您是对的,因为此POSIX规范是针对UNIX shell的,但是在这里看起来JVM作者决定以相同的方式实现其返回代码。
马努
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.