나는 다음과 같은 문제에 직면하고 있습니다 :
Minecraft Forge Modded Server 1.15.2는 OpenJDK JAVA 1.8.0_275-8u275-b01-1-b01을 실행하는 Debian 10 VM에서 실행되고 있습니다. Modpack의 불안정성으로 인해 서버가 가끔 충돌하는 경우가 있습니다.
Stackoverflow의 솔루션을 사용해 보았습니다.https://stackoverflow.com/questions/62143022/how-do-i-automatically-restart-a-minecraft-spigot-server-in-the-event-of-a-crash 그러나 불행하게도 이것은 나에게 효과가 없습니다.
내가 직면한 문제는 Minecraft 서버가 중지되거나 충돌하는 경우 서버는 중지되지만 JVM은 계속 실행된다는 것입니다. 프로세스에서 종료 코드를 가져오는 데 실패했습니다... 위 링크에 표시된 대로 서버가 현재 시작 중입니다. Windows 컴퓨터를 사용하더라도 동일한 동작이 발생합니다. 서버는 중지되지만 JVM은 계속 실행됩니다. CMD와 파워셸.
지금까지 유용한 것을 찾을 수 없습니다.
고마워요, 다누비
답변1
일반적으로 종료 코드에 따라 다시 시작됩니다. 하지만 애플리케이션이 중단되면 더 과감한 조치를 취해야 합니다.
개념적으로 스크립트는 서버를 중지하려는 의도를 이해해야 합니다. 여기에는 /stop
명령의 표준 출력을 구문 분석하는 작업이 포함될 수 있으며 더 간단하게는 systemctl stop minecraft
.
스크립트가 중지 의도를 이해하면 애플리케이션이 정상적으로 종료될 때까지 합당한 시간 동안 기다려야 합니다. 해당 시간이 만료되면 애플리케이션이 중단되었음을 의미하므로 보다 긍정적인 메시지를 보내야 합니다.신호예를 들어 SIGKILL은 애플리케이션을 강제로 중지합니다.
실제로는 구현하기가 다소 어려울 수 있습니다 screen
. 하지만 이를 사용하여 systemd
Minecraft 서버를 관리하면 쉽습니다.
바라보다이 답변Minecraft 서버 관리 구현 systemd
. 주의를 기울이다Restart=
:
[System]
Restart=on-failure
즉, 서비스가 실패하면 자동으로 다시 시작됩니다. Restart=always
깨끗한 종료 코드로 중지되더라도 시작되도록 하는 방법을 시도해 볼 수도 있습니다 .
또한 systemd는 서비스에 추가하고 필요에 따라 수정하여 사용자 정의할 수 있는 기본값을 제공합니다.
[Service]
TimeoutStopSec=90s
KillSignal=SIGTERM
FinalKillSignal=SIGKILL
이것을 시도하거나 systemctl stop
아무 systemctl restart
일도 일어나지 않으면 systemd는 프로세스를 삭제하기 전에 정상적으로 종료될 때까지 90초를 기다립니다. 위의 숫자를 변경하여 기본 시간과 신호를 수정할 수 있습니다.
systemctl restart minecraft
물론, 이 모든 것은 서버를 다시 시작하려고 할 때 전송(또는 작성한 스크립트)을 가정합니다. 게임 플레이 중에 서버가 멈추는지 감지하지 못합니다.