⛏️

Node.jsでマイクラサーバーを自動再起動

2022/09/18に公開

マイクラサーバーの種類

マイクラでは大きく分けて4つのサーバーがあります。
今回は下記のVanillaサーバーを使用していこうと思います。

Vanillaサーバー (公式が配布している通常のサーバー)
プラグインサーバー (Bukkit, Spigot)
Modサーバー (Forge, Fablic)
Realms (公式が自動で立ててくれるサーバー)

準備

使用するライブラリをインストールしていきます。
今回はnode-cronというライブラリを使用して24時間ごとにサーバーを再起動します。

$ npm init
$ npm i node-cron

サンプルコード

今回はまとまりをわかりやすくするためにclassで実装しました。

server.js
const { spawn } = require('child_process');
const { schedule } = require('node-cron');

class Server {
  constructor() {
    this.start();
    this.restart();
  }
  start() {
    this.proc = spawn(
      'java',
      ['-Xms1G', '-Xmx1G', '-jar', 'server.jar', 'nogui'],
      { cwd: '/home/user/server'} //server.jarのディレクトリパス
    );
    //ログを表示する
    this.proc.stdout.on('data', console.log);
    this.proc.stderr.on('data', console.error);
  }
  restart() {
    //23時55分にサーバーを閉じる
    schedule('0 50 23 * * *', () => {
      this.proc.stdin.write('say 5分後に再起動します\n');
      setTimeout(() => {
        this.proc.stdin.write('stop\n');
      }, 5 * 60 * 1000);
    });
    //0時0分にサーバーを起動する
    schedule('0 0 0 * * *', () => this.start());
  }
}

const server = new Server();

おまけ

nodemonで定期再起動

nodemonを使って同じような実装をすることができる。

$ npm i -g nodemon
サンプルコード
server.js
const { spawn } = require('child_process');
const { schedule } = require('node-cron');

const server = spawn(
  'java',
  ['-Xms1G', '-Xmx1G', '-jar', 'server.jar', 'nogui'],
  { cwd: '/home/user/server'} //server.jarのディレクトリパス
);
//ログを表示する
server.stdout.on('data', console.log);
server.stderr.on('data', console.error);

//サーバーを閉じる
schedule('0 50 23 * * *', () => {
  server.stdin.write('say 5分後に再起動します。\n');
  setTimeout(() => {
    server.stdin.write('stop\n');
  }, 5 * 60 * 1000);
});

//サーバー終了時にプロセスごと落とす
server.on('close', () => process.exit(1));
起動する
$ nodemon --watch server.js --exec "node server.js | touch server.js"

process.exit(1)でプロセスが終了したとき、touchコマンドでファイルのタイムスタンプを更新します。
そして、--watchで監視しているserver.jsが更新されることで再起動されるという仕組みです。

あとがき

はじめて技術記事を書いてみました。
最初はマークダウン記法などを覚えるのに少し苦労しましたが、
書いていて終始とても楽しかったです!!
今まで技術記事を執筆することに敷居の高さを感じていました。
でも、こうして実際に触れてみることで「意外と簡単だな(?)」と思えるようになりました。
この記事が誰かのためになると幸いです。
最後まで見ていただきありがとうございました!

Discussion