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

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

我们有一个简单的 systemd 脚本,用于以服务方式启动 MineCraft 服务器。SO 是 CentOS 7。以下是脚本:

[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)

任何想法?

谢谢

答案1

退出代码 143 表示程序收到 SIGTERM 信号指示其退出。JVM 捕获该信号,执行干净关闭,即运行所有已注册的关闭钩子,但仍以退出代码 143 退出。这就是 Java 的工作原理。

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

[Service]
SuccessExitStatus=143

答案2

为了补充 Michael 的回答,退出代码 143 在此处是正常的,这是 Java VM 接收由 systemd 发送的 SIGTERM 信号以停止进程的方式。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 程序是因为外部信号而退出的,并且你有机会找出哪个信号。

相关内容