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

kal*_*ise 27 systemd 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
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

任何的想法?

谢谢

Mic*_*ton 39

退出代码 143 表示程序收到一个 SIGTERM 信号来指示它退出。JVM 捕获信号,执行干净的关闭,即它运行所有已注册的关闭挂钩,但仍以退出代码 143 退出。这就是 Java 的工作方式。

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

[Service]
SuccessExitStatus=143
Run Code Online (Sandbox Code Playgroud)

  • 用 Java 应用程序处理信号的“正确”方法是什么?我能找到的最接近的是关闭挂钩,但文档中没有提到关闭挂钩会改变应用程序的退出代码。 (4认同)

Man*_*anu 17

为了补充迈克尔的回答,退出代码 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 程序由于外部信号而退出,并且您有机会找出哪个信号。