我们有一个简单的 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 程序是因为外部信号而退出的,并且你有机会找出哪个信号。