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


19

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

어떤 생각?

감사

답변:


27

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

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

[Service]
SuccessExitStatus=143

효과가있다. 이제 서비스가 예상대로 비활성 상태입니다.
kalise

4
Java 애플리케이션으로 신호를 처리하는 "적절한"방법은 무엇입니까? 내가 찾을 수있는 가장 가까운 것은 종료 후크이지만 설명서의 어느 것도 종료 후크가 응용 프로그램의 종료 코드를 변경한다고 언급하지 않습니다.
Spoage

@SPoage stackoverflow.com/q/2975248/1068283 그러나 종료 훅이 존재하더라도 Java는이 경우 항상 코드 143으로 종료됩니다.
마이클 햄튼

10

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 프로그램이 종료되었음을 알 수 있으므로 어떤 신호를 찾을 수 있기 때문에 의미가 없습니다.


참조 된 POSIX 스펙 텍스트는 쉘의 작동 방식을 지정하는 것으로 보이며 "쉘은 명령 언어 해석기"입니다. Java VM은 해당 사양에서 다루지 않는 것 같습니다. 쉘이 SIGTERM으로 인해 종료되는 Java VM (또는 다른 프로그램)을 해석하는 방법-종료 코드를 143으로 설정해야합니다-사양에 확실히 포함되어 있지만 쉘에는 관련이 없습니다.
doshea

이 POSIX 스펙은 UNIX 쉘에 관한 것이지만 여기에서는 JVM 작성자가 리턴 코드를 동일한 방식으로 구현하기로 결정한 것 같습니다.
마누
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.