systemctl로 중지 한 후 서비스는 실패 상태로 유지됩니다 서비스는 실패 상태로 유지됩니다. 보다: systemctl

서비스 방식으로 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)

어떤 생각?

감사



답변

종료 코드 143은 프로그램이 종료하도록 지시하는 SIGTERM 신호를 받았지만 신호를 올바르게 처리하지 않았 음을 의미합니다. 이것은 거의 항상 프로그래밍 오류로 인한 것이며 모든 유형의 Java 응용 프로그램에서 일반적입니다.

종료 코드를 유닛 파일에 “성공”종료 상태로 추가하여이를 억제 할 수 있어야합니다.

[Service]
SuccessExitStatus=143

답변

Michael의 답변을 보완하기 위해 종료 코드 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을 얻습니다.

이 0이 아닌 종료 코드는 외부 신호로 인해 Java 프로그램이 종료되었음을 알 수 있으므로 어떤 신호를 찾을 수 있기 때문에 의미가 없습니다.