私は次の問題に直面しています:
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
もちろん、これらすべては、サーバーを再起動しようとしたときに転送(または作成したスクリプト)を想定しています。ゲームプレイ中にサーバーがフリーズしているかどうかは検出されません。