⛏️
Node.jsでマイクラサーバーを自動再起動
マイクラサーバーの種類
マイクラでは大きく分けて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