終了コードはクラッシュの理由ではなく、ただの「お手上げ」だ
数字は何も語らない。その上の行がすべてを語っており、それはすでにログフォルダに入っている。「終了コード1」はプロセスの異常終了を示すだけで、原因はlatest.logやクラッシュレポートに書かれています。逆方向から読むのが近道です。
Exit Code 1 を出力して停止するJavaサーバー。メッセージはそれだけだ。終了コード1は「プロセスが異常終了した」という意味であり、原因ではなく分類にすぎない。ワールドフォルダの欠落から、クラスロード中に例外を投げるModまで、あらゆるケースがこのコードに含まれる。
本当の答えがある場所
終了コードを出力しているのはゲームではなく、ランチャーやホスティングパネルだ。原因は logs/latest.log にあり、クラッシュの場合はサーバーが crash-reports/ 以下に保存するレポートにもある。ログの末尾から逆方向に読み、最初の Exception、Caused by:、または Failed to に突き当たったらそこで止める。その行にクラス名、Mod名、またはファイル名が書かれている。
[Server thread/ERROR]: Encountered an unexpected exception
java.lang.NoSuchMethodError: net.minecraft.world.level.Level.getBiome
at com.example.mod.ExampleMixin.inject(ExampleMixin.java:41)
Caused by: java.lang.NoClassDefFoundError: com/example/lib/Helper
ここでの NoClassDefFoundError は依存関係の欠落であり、ワールドの破損ではない。終了コードはそんなこと一切教えてくれなかった。
実際に目にする終了コード
| コード | 通常の意味 |
|---|---|
| 0 | 正常終了 — /stop またはスケジュールされた再起動 |
| 1 | ウォッチドッグが停止したティックを強制終了した、JVMが起動を拒否した、またはランチャーやModローダーがクラッシュを報告した |
| 137 | OSによる強制終了。ほぼ常にOOMキラー |
| 143 | SIGTERM — コンテナオーケストレーターによる停止 |
コード137は、人々がクラッシュと誤読しがちなものだ。JVMは失敗していない。プロセスがメモリを使いすぎたと、外部の何かが判断したのだ。
JavaとBedrockは同じ問題ではない
Bedrockの専用サーバーは別のプログラムであり、独自のログ形式を持つ。Javaのログ向けに書かれたアドバイスはそのまま当てはまらない。
Mod構成では失敗の仕方が異なる
Modを導入している場合、最初の例外はしばしば症状にすぎない。Mixinの適用失敗は連鎖を引き起こし、真の原因は最初の Mixin apply failed 行であり、30行後にある NoSuchMethodError ではない。Exception を検索する前に、ログ内で Mixin を検索しよう。
サーバーが起動しているかどうかの確認
ログはなぜ死んだかを教えてくれる。今生きているかどうかは教えてくれない。サーバーポートへのステータスクエリを使えば、1回のリクエストでそれがわかる。ここにあるツールはJavaサーバーをチェックする。BedrockはUDPで通信するため、専用のクエリが必要だ。
ログをサーバー診断ツールに貼り付ければ失敗行を抽出でき、ホストを指定すればサーバーが実際に応答しているかを確認できる。