さくらのVPSにspigotインストール(CentOS 7)

インストール
記事内に広告が含まれています。

「さくらのVPS」+「CentOS 7」に「spigot」をインストール手順をまとめてあります。

spigotサーバについて

「spigot」とは「minecraft_server(マルチ)」に、色々なプラグイン(modみたいなもの)を追加できるようにしたサーバMODです。

「spigot」に追加できるプラグインには、「荒らし対策」「管理ツール」「ゲームルールの追加」等色々な種類がありますので、それを組み合わせることで自分好みの世界を構築することが出来ます。

公式のminecraftマルチサーバ(minecraft_server)では物足りなくなった方や、色々なプラグインをつかってサーバをより快適に管理、運用していきたい方などはこちらを使ってみるのも良いかもしれません。

インストール自体は非常に簡単なので、気軽に試してみましょう。

インストール作業の流れ

ざっくりと作業の流れを説明すると以下のようになります。

  • サーバの用意
  • OSインストール・設定
  • javaインストール
  • screenインストール
  • wgetインストール
  • gitインストール
  • spigot動作用ユーザ作成
  • spigotビルド
  • spigot設定(EULA同意)
  • 起動・停止スクリプト作成
  • 自動起動設定

バニラの「minecraft_server」インストールとの大きな違いは、「git」をインストールすることと、「spigot」の実行ファイルを自分でビルド(実行ファイルを作成)するぐらいです。

なぜわざわざビルドするのか?

サーバMODとして以前は「CraftBukkit」というのが有名でしたが、ライセンスの関係で揉めていてDMCA(デジタルミレニアム著作権法)を受けて公開停止となり、そのあおりで「spigot」も公開停止になっていたのですが、バージョン1.8からユーザがビルドするという形での配布が再開されました。

サーバの用意

インターネットに公開して、手っ取り早くみんなで遊べる環境を構築するために、今回は「さくらのVPS」と「CentOS 7」という組み合わせで「spigot」をインストールしていきます。

今回私が契約したプランはさくらのVPS 2Gのタイプです。

※さくらのVPSは途中でメモリの増強とかが出来ないので、事前に無料の試用期間で動作確認を行ってどのスペックのサーバ良いか確認してみてください。

サーバスペックについて

VPS上に「spigot」をインストールする場合には、メモリは2Gプラン以上をおすすめします。

導入するプラグインにもよりますが、それ以下のメモリでは動作が重かったりして快適に遊べない恐れがあります。

OSインストール・設定

OSインストール

VPSに「spigot」をインストールする場合は、メモリを節約するためにも「Minimal Install」(最小構成)でインストールし、GUI環境は入れないほうが良いでしょう。(普段の操作もSSHでのCUIがメインとなるはずです)

ちなみに、私は「Minmarl Install」の際にいつも開発環境だけは追加でインストールして、その他に必要なソフトがあれば、個別にインストールしています。

OSインストール時に追加でインストールしているソフト

  • Compatibility Libraries
  • Development Tools

さくらのVPSの場合

「さくらのVPS」に「CentOS 7」をインスト―ルした際の手順をこちらのページにまとめてあります。

OS設定

私が最低限行っている作業内容は下記の項目となります。

作業項目

  • セキュリティアップデート
  • SSHの設定 (rootのログイン禁止やポート番号変更など)
  • ファイアーウォール設定
  • SELinux無効化
  • 時刻同期設定

詳しい手順については、こちらのページにまとめてありますので、参考にしてみてください。

javaインストール

「spigot」を動作させるために必要な「java」を「yum」でインストールします。

# yum -y install java

インストールされたjavaのバージョンは下記のコマンドで確認できます。

# java -version
openjdk version "1.8.0_71"
OpenJDK Runtime Environment (build 1.8.0_71-b15)
OpenJDK 64-Bit Server VM (build 25.71-b15, mixed mode)

screenインストール

今回の「spigot」インストール手順では、「screen」を使って「spigot」を動作させるため「screen」をインストールします。

# yum install screen

wgetインストール

「Buildtools」をダウンロードするのに使う、「wget」をインストールします。

# yum install wget

gitインストール

「spigot」の実行ファイル作成(ビルド)は「Buildtools」を使って行うのですが、その際に必要となるため「git」をインストールします。

# yum install git

※ちなみに、実行ファイル作成は「BuildTools」が全部自動でやってくれるので、自分で「git」のコマンドを実際に入力することはありません。

spigot実行ユーザ作成

「spigot」を「root」ユーザで動作させるのはセキュリティ上好ましくないので、動作させるためのユーザを「adduser」コマンドで作成します。

この手順では「spiadmin」というユーザを作成していますが、特にユーザ名には決まりがないので、皆さんのお好きなユーザ名で作成してください。

# adduser spiadmin
# passwd spiadmin

※あまり簡単な名前のユーザを作成すると、SSHのブルートフォース攻撃の餌食になりますので、「admin」とか攻撃対象になりやすいユーザ名はやめましょう。セキュリティを考慮すると、SSHは鍵認証方式にすることをおすすめします。

Buildtoolsダウンロード

「spigot」をビルドするためのツールである「BuildTools」をダウンロードします。

インストールディレクトリ作成

まず、「Buildtools」をダウンロードする前に、「spigot」をインストールする(ビルドする)ためのディレクトリを作成しておきます。

今回の手順では「/opt/spigot」というディレクトリを作成し、そこに「spigot」をインストールしていきます。

# mkdir /opt/spigot

※ディレクトリを作成する場所は好きな場所で良いので、どこに作るかはパーティションの空き容量などをみて判断してください

所有者の変更

作成したディレクトリの所有者を、「spigot」を動作させるユーザに変更します。

今回の手順では「spiadmin」というユーザを作成しているので、「chown」コマンドでディレクトリの所有者を「spiadmin」ユーザに変更します。

# chown spiadmin:spiadmin /opt/spigot

※「spigot」を動作させるユーザを「spiadmin」以外にしている場合は適宜読み替えてください。

Buildtoolsダウンロード

ここからの作業は、「su」コマンドで「spiogt」実行ユーザへ変更して作業を行います。

# su - spiadmin

先ほど作成した「spigot」イントールディレクトリに移動し、そこで「Buildtools」をダウンロードします。

$ cd /opt/spigot

「wget」を使用して「Buildtools」をダウンロードをしてきます。

$ wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar

spigotビルド

ダウンロードしてきた「Buildtools」を使って「spigot」をビルドしていきます。

git設定

まず、事前準備としてgitの設定を行います。

$ git config --global --unset core.autocrlf

この設定は「git」で改行コードを設定しないようにするために行います。

spigotビルド実行

いよいよ「spigot」のビルドを行っていきますが、実行する時間や環境にもよりますが、この工程は結構時間かかります。(10~20分くらい)

$ java -jar BuildTools.jar

ビルドが完了すると、複数のファイルが作成されていますが、「spigot-x.x.x.jar」ファイルが「spigot」の実行ファイルとなります。

$ ls
apache-maven-3.2.5  BuildTools.log.txt  craftbukkit-1.9.jar  work
BuildData           Bukkit              Spigot
BuildTools.jar      CraftBukkit         spigot-1.9.jar

バージョンの指定方法

バージョンを指定してビルドしたい場合は「–rev バージョン」と指定することで、好きなバージョンのjarファイルを作成することが出来ます。

バージョン指定

バージョン1.8.8の実行ファイルをビルドする場合は、下記のように実行します。

$ java -jar BuildTools.jar --rev 1.8.8

EULA(使用許諾契約)同意

ビルドした「spigot-x.x.jar」の初回起動時は「eula.txt」への編集(使用許諾契約)が必要となりますので、かならず起動に失敗します。

これは、バニラのminecraft_Serverと同じですね

spigot起動

「eula.txt」を作成するために「spigot」を起動させます。

$ java -Xms1024M -Xmx1024M -jar spigot-1.9.jar nogui
Loading libraries, please wait...
[16:57:39 INFO]: Starting minecraft server version 1.9
[16:57:39 INFO]: Loading properties
[16:57:39 WARN]: server.properties does not exist
[16:57:39 INFO]: Generating new properties file
[16:57:39 WARN]: Failed to load eula.txt
[16:57:39 INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
[16:57:39 INFO]: Stopping server

※「spigot-1.9.jar」の部分は起動させる実行ファイル名に読み替えてください。

eula.txt編集(使用許諾契約)

「spigot」を起動すると、「eula.txt」が作成されるので内容を確認し「eula=false」の部分を「eula=true」に変更します。

$ vi eula.txt

変更前

eula=false

変更後

eula=true

spigot動作確認

「eula.txt」の編集が完了したら、再度「spigot」を起動し「minecraft」クライアントからログインして動作確認してください。

spigot起動

$ java -Xms1024M -Xmx1024M -jar spigot-1.9.jar nogui

動作確認

「minecraft」クライアントからログインして動作確認します。

spigot停止

動作確認が終わったら、サーバのコンソールから「stop」コマンドを実行して、一度「spigot」を停止させておいてください。

[00:08:05 INFO]: tamohiko lost connection: Disconnected
[00:08:05 INFO]: tamohiko left the game.
>stop
[00:08:11 INFO]: Stopping the server
[00:08:11 INFO]: Stopping server
[00:08:11 INFO]: Saving players
[00:08:11 INFO]: Saving worlds
[00:08:11 INFO]: Saving chunks for level 'world'/Overworld
[00:08:11 INFO]: Saving chunks for level 'world_nether'/Nether
[00:08:11 INFO]: Saving chunks for level 'world_the_end'/The E

起動・停止スクリプト作成

「spigot」を「systemd」で管理し自動起動できるようにするため、起動と停止用のスクリプトを作成していきます。

起動スクリプト作成

「spi_start.sh」という名前で起動スクリプトを作成していきます。

$ vi spi_start.sh

変数説明

起動スクリプトで設定が必要な変数の説明です。

変数 設定内容
USERNAME spigot実行ユーザを設定
SERVICE spigot実行ファイルを設定(spigot-x.x.jarファイル名を指定)
SCNAME screenに指定する名前を設定
MC_PATH spigotがインストールされているディレクトリを設定
XMX spigot最大メモリ使用量を設定
XMS spigot初期メモリ使用量を設定

※「XMX」と「XMS」については、「spigot」が使用するメモリの量となります。この値を変更する場合は、かならずOSが使用するメモリ分は残るように設定指定ください。

起動スクリプト

[shell]
#!/bin/bash

USERNAME=’spiadmin’
SERVICE=’spigot-1.9.jar’
SCNAME=’spigot’
SPI_PATH=’/opt/spigot’

XMX="1024M"
XMS="1024M"

cd $SPI_PATH

ME=`whoami`

if [ $ME == $USERNAME ] ; then
if pgrep -u $USERNAME -f $SERVICE > /dev/null
then
echo "$SERVICE is already running!"
else
echo "Starting $SERVICE…"
screen -AmdS $SCNAME java -Xmx$XMX -Xms$XMS -jar $SERVICE nogui
fi
else
echo "Please run the minecraft user."
fi
[/shell]

停止スクリプト作成

「spi_stop.sh」という名前で停止スクリプトを作成していきます。

$ vi spi_stop.sh

変数説明

停止スクリプトで設定が必要な変数の説明です。

変数 設定内容
USERNAME spigot実行ユーザを設定
SERVICE spigot実行ファイルを設定(spigot-x.x.jarファイル名を指定)
SCNAME screenに指定する名前を設定
MC_PATH spigotがインストールされているディレクトリを設定

停止スクリプト

[shell]
#!/bin/bash

USERNAME=’spiadmin’
SERVICE=’spigot-1.9.jar’
SCNAME=’spigot’
SPI_PATH=’/opt/spigot’

cd $SPI_PATH

ME=`whoami`

if [ $ME == $USERNAME ] ; then
if pgrep -u $USERNAME -f $SERVICE > /dev/null
then
echo "Stopping $SERVICE"
screen -p 0 -S $SCNAME -X eval ‘stuff "say SERVER SHUTTING DOWN IN 10 SECONDS. Saving map…"\015’
screen -p 0 -S $SCNAME -X eval ‘stuff "save-all"\015’
sleep 10
screen -p 0 -S $SCNAME -X eval ‘stuff "stop"\015’
sleep 10
echo "Stopped minecraftserver"
else
echo "$SERVICE was not runnning."
fi
else
echo "Please run the minecraft user."
fi
[/shell]

パーミッション変更

spigot実行ユーザのみが起動・停止シェルを実行できるように、パーミッションの設定を行います。

$ chmod 744 spi_start.sh
$ chmod 744 spi_stop.sh

パーミッションの確認

spigot起動ユーザのみが、実行できるようになっていることを確認します。

$ ls -l spi_*
-rwxr--r-- 1 spiadmin spiadmin 411 Mar 10 16:01 spi_start.sh
-rwxr--r-- 1 spiadmin spiadmin 631 Mar 10 16:03 spi_stop.sh

スクリプト動作確認

起動スクリプト実行確認

$ ./spi_start.sh
screenの確認

「spi_start.sh」から起動された「spigot」はスクリプト内の「SCNAME」で設定された名前のscreen上で実行されています。

「screen -ls」コマンドでscreenの状態を確認できます。

$ screen -ls
There is a screen on:
        1472.spigot     (Detached)
1 Socket in /var/run/screen/S-spiadmin.
screenへの接続

「screen -r spigot」と実行することで接続(Attach)することができるので、正常にminecraftが起動されているかどうか確認します。

$ screen -r spigot
[12:34:45 INFO]: Cane Growth Modifier: 100%
[12:34:45 INFO]: Melon Growth Modifier: 100%
[12:34:45 INFO]: Mushroom Growth Modifier: 100%
[12:34:45 INFO]: Pumpkin Growth Modifier: 100%
[12:34:45 INFO]: Sapling Growth Modifier: 100%
[12:34:45 INFO]: Wheat Growth Modifier: 100%
[12:34:45 INFO]: NetherWart Growth Modifier: 100%
[12:34:45 INFO]: Tile Max Tick Time: 50ms Entity max Tick Time: 50ms
[12:34:45 INFO]: Item Despawn Rate: 6000
[12:34:45 INFO]: Item Merge Radius: 2.5
[12:34:45 INFO]: Arrow Despawn Rate: 1200
[12:34:45 INFO]: Allow Zombie Pigmen to spawn from portal blocks: true
[12:34:45 INFO]: View Distance: 10
[12:34:45 INFO]: Zombie Aggressive Towards Villager: true
[12:34:45 INFO]: Experience Merge Radius: 3.0
[12:34:45 INFO]: Preparing start region for level 0 (Seed: 6061323866878942654)
[12:34:46 INFO]: Preparing spawn area: 9%
[12:34:47 INFO]: Preparing spawn area: 68%
[12:34:48 INFO]: Preparing start region for level 1 (Seed: 6061323866878942654)
[12:34:49 INFO]: Preparing spawn area: 73%
[12:34:49 INFO]: Preparing start region for level 2 (Seed: 6061323866878942654)
[12:34:49 INFO]: Server permissions file permissions.yml is empty, ignoring it
[12:34:49 INFO]: Done (5.086s)! For help, type "help" or "?"

正常に起動が完了すると「Done」と表示されて、コマンド入力待ちになっているはずですので、ば正常に起動されていますので、minecraftのクライアントから接続できるか試してみてください。

動作確認が終了したましたら、今接続している「screen」から抜けて(Dtach)ください。

screenからの抜け方(Detach)

「Ctrl」+「a」を押下した後に「d」を押下することで「screen」から抜ける(Detach)ことができます。

停止スクリプト実行確認

起動スクリプトの動作確認が終わったら、次に停止スクリプトの動作確認を行います。

停止スクリプト実行
$ ./spi_stop.sh

「spigot」が無事停止できているか、「screen -ls」コマンドで確認してください。

正常にスクリプトが実行されると、「spigot」が停止し起動スクリプトで作成された「screen」も終了します。

$ screen -ls
No Sockets found in /var/run/screen/S-spiadmin.

自動起動設定

起動スクリプトと停止スクリプトが完成しましたら、今度はサーバの再起動を行っても自動で「spigot」が起動してくるように、自動起動の設定を行っていきます。

自動起動設定ファイル作成

まず、自動起動用の設定ファイルを作成していきます。

# vi /etc/systemd/system/spigot.service

設定箇所

設定が必要な箇所の説明です。

変数 設定内容
User spigot実行ユーザを設定
ExecStart spigot実行スクリプト
ExecStop spigot停止スクリプト
設定ファイル

[shell]
[Unit]
Description=Minecraft Server (spigot)
After=network.target local-fs.target

[Service]
Type=forking
User=spiadmin
ExecStart=/opt/spigot/spi_start.sh
ExecStop=/opt/spigot/spi_stop.sh

[Install]
WantedBy=multi-user.target
[/shell]

自動起動設定

設定ファイルが完成しましたら、「systemctl」コマンドを使用して、自動起動の設定を行います。

# systemctl enable spigot.service

動作確認

自動機能設定が完了しましたら、動作確認としてサーバの再起動を行って「spigot」が自動的に起動してくるか確認してください。

無事起動してきましたら、インストール作業は完了となります。

コメント

  1. 匿名希望 より:

    手順通りに行い、
    ./spi_start.shを実行しようとしているのですが
    spigot-1.8.8.jar was not runnning.
    と出て実行できません。
    解決方法をご教授ください。

    • tamohiko より:

      匿名希望さん

      ご質問ありがとうございます。

      > ./spi_start.shを実行しようとしているのですが
      > spigot-1.8.8.jar was not runnning.
      > と出て実行できません。

      これは、直接下記のようなコマンドでspigotは実行できるが、「spi_start.sh」スクリプトからはspigotが実行できないという事でしょうか。
      $ java -Xms1024M -Xmx1024M -jar spigot-1.9.jar nogui

      まず、一点確認していただきたいのですが、

      > spigot-1.8.8.jar was not runnning.

      このメッセージは、spigotが起動していない場合に「spi_stop.sh」を実行した場合に表示されるメッセージのように見受けられます。
      spi_start.shの内容に間違いが無いか確認お願いします。

      内容に間違いがない場合は、下記のようにしてスクリプトを実行してみてください。
      これで、シェル実行状況が表示されるので、どこでエラーが発生しているのかがわかると思います。

      sh -x ./spi_start.sh

      エラーが発生している場所が分かりましたら、
      お手数をおかけしますが、エラーが発生している部分をこちらに書き込んでいただけますでしょうか。

      以上、よろしくお願いいたします。

      • 匿名希望 より:

        ご返信あありがとう御座います。

        $ java -Xms1024M -Xmx1024M -jar spigot-1.8.8
        .jar noguiでは実行できますが、./spi_start.shで実行できない状態でした。

        確認をしたところスプリクト内のメモリ指定の値が、
        XMX=”512M”
        XMS=”1024M”
        と逆に指定していたためと分かりました。

        値を正しくしたところ起動することができました。

        • tamohiko より:

          匿名希望さん

          返信ありがとうございます。

          無事起動できたようで何よりです。
          また、原因につきましてもお教えいただき、ありがとうございました。

          これから始まるマイクラライフをお楽しみくださいね!

  2. hypi より:

    こんにちは
    質問させてください

    ひととおり手順通りにでき、手動で起動スクリプトと停止スクリプトも無事にできましたが、「自動起動設定」が出来ない状態です。

    # systemctl enable spigot.service と打つと
    Failed to execute operation: Invalid argument と出てしまいます。

    確認する点などありましたらよろしくお願いします。

    • tamohiko より:

      hypiさん

      コメントありがとうございます。

      > # systemctl enable spigot.service と打つと
      > Failed to execute operation: Invalid argument と出てしまいます。

      自動起動設定時のエラーについてですが、「/etc/systemd/system/multi-user.target.wants」ディレクトリにリンクではなく「spigot.service」ファイルの実体が無いか確認してみて下さい。

      私の環境では「/etc/systemd/system/multi-user.target.wants」に実体のファイルがある場合に、「systemctl enable spigot.service」を実行すると同様のメッセージが表示されました。

      この場合は「/etc/systemd/system/multi-user.target.wants」にある「spigot.service」ファイルを削除してから、再度「systemctl enable spigot.service」を実行してみてください。

      • hypi より:

        tamohikoさん

        さっそくのご返答ありがとうございます。確認いたしましたところ
        「/etc/systemd/system/multi-user.target.wants」ディレクトリに「spigot.service」ファイルはありませんでした。
        「/etc/systemd/system」に「spigot.service」ファイルが存在している状態です。

        何度も申し訳ありません。
        よろしくお願いします。

        • tamohiko より:

          hypiさん

          ご確認ありがとうございます。

          > 「/etc/systemd/system/multi-user.target.wants」ディレクトリに「spigot.service」ファイルはありませんでした。
          > 「/etc/systemd/system」に「spigot.service」ファイルが存在している状態です。

          であれば、ちょっとすぐには原因がわからないかもしれません。

          とりあえずの対応としては、
          下記のように直接シンボリックリンクを張るという方法もありますので試してみてください。

          # ln -s /etc/systemd/system/spigot.service /etc/systemd/system/multi-user.target.wants/

          Failed to execute operation: Invalid argumentになる原因についてはもう少し調べてみます。

  3. Reaper より:

    手順どうりに進めてるんですけど、起動スクリプト実行確認の場所で躓いてます。
    ./spi_start.shのところはうまく行ってるんですけどその後のscreenの確認で”screen -ls”のコマンド打ったところscreen -ls
    “No Sockets found in /var/run/screen/S-spiadmin.”と返されてしまいます。どうしたらいいですか?

    • tamohiko より:

      Reaperさん

      コメントありがとうございます。

      spi_start.shでspigot自体は起動できていますか?
      出来ていないようでしたら、スクリプトに何らかの間違いがあると思いますので、再度確認してみて下さい。

      スクリプトを実行する際に「-x」を付けて実行すると、実行状況が表示されるので、原因調査の役に立つと思います。

      あと確認する点としては、「SERVICE=」の部分で設定しているjarファイル名は間違いないか、「SPI_PATH=」で指定しているディレクトに間違いがないかも確認してみてください。

      • Reaper より:

        「SPI_PATH=」で指定しているディレクトは、spigot.jerがある場所の指定ですよね

        • tamohiko より:

          Reaperさん

          > 「SPI_PATH=」で指定しているディレクトは、spigot.jerがある場所の指定ですよね

          はい、そのとおりです。

  4. Reaper より:

    Serverは開いたんですけど、前のワールドをVPSサーバーに入れたらすぐにサーバーが閉じてしまいます、どうしたらいいですか?

    • tamohiko より:

      Reaperさん

      状況をもう少し詳しく教えていただけますでしょうか。

      > Serverは開いたんですけど

      これはspigot自体は起動しているということですか。

      > 前のワールドをVPSサーバーに入れたらすぐにサーバーが閉じてしまいます

      サーバが閉じてしまうとはクライアントから入れないという事でしょうか?
      それとも、spigot自体が終了してしまうという事ですか?

      現在の情報だけですと、何が起きているのかが分からないので、
      logsフォルダにあるログを確認して頂けますでしょうか。

      そちらを確認することで、もう少し詳しい情報や原因がわかるかもしれません。

      以上、よろしくお願いいたします。

      • Reaper より:

        [Server thread/INFO]: Saving worldsのところでServerが閉じてしまいます

        • tamohiko より:

          Reaperさん

          > [Server thread/INFO]: Saving worldsのところでServerが閉じてしまいます

          調査ありがとうございます。

          ただ、このメッセージだけでは原因が分からないので、
          お手数をおかけしますが、もう少し詳しい情報を教えてください。

          spigotの起動に失敗するという事は、
          ログの中にERRORとかWARNレベルのログが表示されていると思うのですが、
          それらに関連するログを教えてください。

  5. root より:

    ソースはオープンソースですか?

    • tamohiko より:

      rootさん

      コメントありがとうございます。
      お返事遅れてすいません。

      spigotのソースということでしょうか?
      であれば、オープンソースですよ。

      詳しくは公式サイトをご確認いただくと詳しい情報が記述されています。
      https://www.spigotmc.org/wiki/about-spigot/

  6. kery より:

    サーバーの動作確認のところで
    サーバーログインしようとすると
    クライアント側でio.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused:
    とエラーメッセージが表示されます……

    • tamohiko より:

      keryさん

      コメントありがとうございます。

      エラーメッセージに「Connection refused:」と出ているので、何らかの理由で接続が拒絶されているみたいですね。

      原因の切り分けとして、いったんクライアント側OSのファイアウォールを停止して接続できるか確認してみることはできますか?(確認後はファイアウォールの再開を忘れずに行ってください)

      もし、これで接続できるようであれば、ファイアウォールが原因であると考えられるので、ファイアウォールの設定でjavaが許可されているか確認してみてください。

  7. matter より:

    間違えて全てrootフォルダに保存してしまったのですが、その場合スクリプトの設定はどこを変えればいいのでしょうか?

    • tamohiko より:

      matterさん

      コメントありがとうございます。

      > 間違えて全てrootフォルダに保存してしまったのですが、その場合スクリプトの設定はどこを変えればいいのでしょうか?

      「/root」ディレクトリにspigotを保存した場合は、起動と停止スクリプトの「SPI_PATH」の部分を変更する必要があります。

      「/root/spigot」といったディレクトリに保存している場合は下記のようになります。

      変更前 SPI_PATH=’/opt/spigot’
      変更後 SPI_PATH=’/root/spigot’

      また、起動・停止スクリプトの保存ディレクトリも変更されている場合はしている場合は自動起動用の設定ファイルである「spigot.service」の「ExecStart」と「ExecStop」も変更する必要があります。

      あと、「/root」ディレクトリに保存した場合に気になる点としては、ディレクトリのパーミッションの関係で「spigot」の実行ユーザを「root」に設定しなければエラーとなるかもしれません。

      ですが、「spigot」を「root」ユーザで実行することはセキュリティの関係からおすすめできませんので、どこか別のディレクトリに移動させて運用するほうが良いのではないかと思います。

  8. 野崎 より:

    /stopをやった後に自動再起動するようにと思って下のやつをstart.shに追加してみたんですけど、プレーヤーがログインした瞬間落ちてしまいます
    もしわかれば教えてください!

    while true
    do
    screen -AmdS $SCNAME java -Xmx$XMX -Xms$XMS -jar $SERVICE nogui
    echo “Restarting $SERVICE …”
    for i in 5 4 3 2 1
    do
    echo “$i…”
    sleep 1
    done
    echo “I’M REBOOTING”
    done

    screenで見ているとエラーは出てないんですが、
    screen -r spigot とコンソールにいれると、xxx.spigotみたいなのが何個かでてきてしまいます

    環境:
    conohaの2GBプラン
    CentOS7
    Bungeecord使用(ロビーサーバ+ミニゲームサーバの組み合わせで、今回はミニゲームサーバのほうを自動再起するようにしたい)

    • 野崎 より:

      ごめんなさい自己解決しました
      ロビーサーバ用のポートと、ミニゲームサーバ用のポートが同じになってしまっていたため、起動直後にstopしてたみたいです。。。

      • 野崎 より:

        あとstart.shはこれにかえました
        https://qiita.com/sifue/items/9ce2ddebccb60a939862

        • tamohiko より:

          野崎さん
          コメントとありがとうございます。

          問題は無事解決されたようでなによりです。

          > ロビーサーバ用のポートと、ミニゲームサーバ用のポートが同じになってしまっていたため、起動直後にstopしてたみたいです。。。

          ポートの衝突はよくやりがちな失敗ですよね。
          私もたまに同じようなことをやってしまいます。

          > あとstart.shはこれにかえました

          死活監視してくれるのはとても便利ですね!
          ご紹介ありがとうございました。

          ちなみに、systemdの機能でも同様のことができたりします。
          (野崎さんが思い描いている動作と異なるかもしれませんが)
          systemd用の自動起動設定ファイルの[Service]欄に「Restart=always」という設定を追加することで、サービスが終了した場合に自動的に再起動してくれるようになります。

          [Service]
          Restart=always

          ただし、この設定をいれるとサーバを停止させることが出来なくなるので私は設定していません…

          その点、紹介していただいたスクリプトの方がminecraftサーバを停止させやすくて使い勝手が良さそうですね。

  9. sasa より:

    すみません。記事の通り設定を進めてサーバー起動も問題なく出来ましたが、起動スクリプトの作成がうまくいかないので教えてほしいです。
    使用しているvpsはconohaで、spigotは1.12.2を使用しています。

    http://or2.mobi/index.php?mode=image&file=189454.jpg

    画像のように設定しており、スクリプトを実行すると「Starting spigot-1.12.2.jar…」となるだけで、サーバーが起動しません。
    スクリプトを使用しない起動方法はうまくいくのですが、何がいけないんでしょうか?

    • tamohiko より:

      sasaさん

      コメントありがとうございます。

      起動スクリプトの件ですが、スクリプト実行後に「logs」フォルダ内の「latest.log」ファイルを確認してみてください。

      何か起動しない原因が表示されているかも知れません。

      また、スクリプトを実行する際に「$ sh -x spi_start.sh」といったように「-x」を指定してスクリプトを実行するとスクリプトの実行状況が分かるので、そちらの方も確認してみてください。

  10. とたけけ より:

    プラグインはどのようにして導入するのですか?

    • tamohiko より:

      とたけけさん

      コメントありがとうございます。

      プラグインは基本的にダウンロードした.jarファイルを「plugins」フォルダに格納しspigotを再起動することで有効化することが出来ます。

      ただ、spigotに対応したバージョンのプラグインを導入する必要があるので、その辺は注意してください。(プラグインの配布サイトにそのあたりの情報は表示されていると思います)

      その後、プラグインによっては「plugin」フォルダ内に作成されたプラグインのフォルダ内の設定ファイルを編集する必要があります。

  11. sasa より:

    あけましておめでとうございます。

    実行後にlogsを確認しましたが、ログには直前にサーバーを終了した情報までしか載っておらず、起動のログは残っていませんでした。

    http://or2.mobi/index.php?mode=image&file=189694.jpg
    -xを指定した際表示されるログがこちらです。黄色い部分はユーザー名や管理者名なので隠しています。

    http://or2.mobi/index.php?mode=image&file=189696.jpg
    spigotフォルダに含まれるデータがこちらです。

    何が原因でしょうか?

    • tamohiko より:

      sasaさん

      お返事が大変遅くなってしまい申し訳ありません。
      こちらのブログの設定の関係で、せっかくいただいたコメントが反映されていませんでした。
      本当にすみません。

      「-x」での起動ログ上で気になるのは、「Xmx」と「Xms」の値が逆ではないでしょうか?
      (前回頂いたコメントの段階で気づけずにすみません)

      「Xmx」が使用するメモリの最大値で、「Xms」が初期メモリ使用値となるため、「Xmx」の値は「Xms」の値より大きいか同等である必要があります。

      ですので、起動スクリプト上で「XMX」と「XMS」の値を同じにするか、「XMX=3072M」と「XMS=1024M」といったように値を逆に設定して再度試してみてください。

      以上、よろしくお願いいたします。

  12. yuyumo6 より:

    起動スクリプトの作成がうまく行きません
    どうすればいいのでしょうか?
    http://or2.mobi/index.php?mode=image&file=200001.png

    • tamohiko より:

      yuyumo6さん

      コメントありがとうございます。

      スクリプトの方を実際に見ていないのですが、張り付けてもらった画像からは下記の部分で原因でエラーが出ているように見えます。

      ME=`whoami`
      if [ $ME == $USERNAME ] ; then

      実行時のログを見てみますと、変数の設定部分で「USERNAME」と記述する箇所が「ERNAME」となっているように見えますので、そこの部分を確認してみてください。

      以上、よろしくお願いします。

  13. lol より:

    このサイトとはあまり関係ないのですが、サーバーは立てれたのですがそのサーバーにワールドデータを入れるやり方がわからないのですが、どうすればいいのでしょうか?
    さくらVPSです。おねがいします

    • lol より:

      あと一応サーバーには入れました。
      VPSに自分のワールドを入れられればいいのですが…
      お願いします!!

      • tamohiko より:

        lol さん

        コメントありがとうございます。

        > このサイトとはあまり関係ないのですが、サーバーは立てれたのですがそのサーバーにワールドデータを入れるやり方がわからないのですが、どうすればいいのでしょうか?

        別環境で遊んでいたワールドデータを持ってきたいという事でしょうか?
        であれば、minecraftがインストールされているディレクトリにある、
        「world」ディレクトリがワールドデータとなるので、それを入れ替えたいワールドデータと置き換えれれば良いですよ。

        Windowsからのワールドデータのアップロード方法は、
        このあたりの書き込みを参考にしてみてください。

        https://minecraft.server-memo.net/conoha_mc_install/#comment-5034

        他にご不明な点がありましたら、ご質問お願いします。

        • lol より:

          win10なのでソフト使ってアップロードしようとしたんですけど、なぜか接続できなくて…
          ちゃんとIPもPASSWARDもあってるのに出来ないんです。
          どうか対処法を教えてください!><

          • lol より:

            ちなみにソフトは WinSCPとFFFTPを使いました。

          • tamohiko より:

            アップロードはscpかsftpになると思いますが、接続ポート番号はあっていますか?

            また、SSH接続に鍵認証方式を採用しているのであれば、秘密鍵の登録は行っていますか?

            WinSCPを使用してSFTPをする際の手順は、こちらのサイトが参考になると思いますので、確認してみてください。

            https://support.conoha.jp/v/sftpwinscp/

            sftpで接続する際は、rootユーザでは接続できないと思いますので、minecraftをインストールしたユーザで接続してください。

  14. lol より:

    できるようになりました!
    ありがとうございます!

    • tamohiko より:

      よかったです!

      • lol より:

        聞き忘れたことがあったんですが、自分のPCと同期できる機能ってありますか?

        • lol より:

          あとスクリプトの$は消して、USERNAMEとか入れればいいんですよね?

          • tamohiko より:

            > あとスクリプトの$は消して、USERNAMEとか入れればいいんですよね?

            これはどの部分を指しているのでしょうか?

        • tamohiko より:

          minecraftやspigotにはそういった機能はありませんので、手動でワールドデータのコピーが一般的な方法となります。

          ちなみに、ワールドデータをコピーする際には、コピー元およびコピー先のマイクラを停止させておく必要があります。

  15. YYYY より:

    こんにちは。
    前のワールドを入れると大量のログが出てきて、サーバーには入れてもワールドが読み込まれてないんですよ。
    どうすれば解決できますか?

    • YYYY より:

      worldファイルに別のワールドのファイルを入れると落ちてしまいます。

      • tamohiko より:

        YYYYさん

        コメントありがとうございます。

        > 前のワールドを入れると大量のログが出てきて、サーバーには入れてもワールドが読み込まれてないんですよ。
        > どうすれば解決できますか?

        表示されるログにエラーの内容が表示されていると思いますが、なんと表示されていますか?

        他に下記の項目についても確認してみてください

        ・ワールドデータのコピー元とコピー先のマイクラのバージョンはあっているか
        ・java版のワールドデータであるか
        ・ワールドデータの所有者がマイクラ実行ユーザと同じかどうか

        • YYYY より:

          [08:23:41 ERROR]: Failed to save chunk
          java.lang.NullPointerException: null
          at net.minecraft.server.v1_12_R1.RegionFile.a(RegionFile.java:200) ~[spigot-1.12.2.jar:git-S pigot-79a30d7-acbc348]
          at net.minecraft.server.v1_12_R1.RegionFile$ChunkBuffer.close(RegionFile.java:304) ~[spigot- 1.12.2.jar:git-Spigot-79a30d7-acbc348]
          at java.util.zip.DeflaterOutputStream.close(DeflaterOutputStream.java:241) ~[?:1.8.0_242]
          at java.io.FilterOutputStream.close(FilterOutputStream.java:159) ~[?:1.8.0_242]
          at java.io.FilterOutputStream.close(FilterOutputStream.java:159) ~[?:1.8.0_242]
          at net.minecraft.server.v1_12_R1.RegionFileCache.e(RegionFileCache.java:95) ~[spigot-1.12.2. jar:git-Spigot-79a30d7-acbc348]
          at net.minecraft.server.v1_12_R1.ChunkRegionLoader.b(ChunkRegionLoader.java:212) ~[spigot-1. 12.2.jar:git-Spigot-79a30d7-acbc348]
          at net.minecraft.server.v1_12_R1.ChunkRegionLoader.processSaveQueueEntry(ChunkRegionLoader.j ava:195) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
          at net.minecraft.server.v1_12_R1.ChunkRegionLoader.a(ChunkRegionLoader.java:167) [spigot-1.1 2.2.jar:git-Spigot-79a30d7-acbc348]
          at net.minecraft.server.v1_12_R1.FileIOThread.c(SourceFile:37) [spigot-1.12.2.jar:git-Spigot -79a30d7-acbc348]
          at net.minecraft.server.v1_12_R1.FileIOThread.run(SourceFile:30) [spigot-1.12.2.jar:git-Spig ot-79a30d7-acbc348]
          at java.lang.Thread.run(Thread.java:748) [?:1.8.0_242]

          • YYYY より:

            こんなようなログがいっぱい流れます
            ワールド内を動いたりすると

          • YYYY より:

            なんかワールドデータのlevel.datファイルなどが文字化けしてました。
            これって元からなのでしょうか?

          • tamohiko より:

            ログを見る限り、ワールドデータが破損しているようにみえますね。
            もう一度ワールドデータをコピーしなおしてみても現象はかわりませんか?

            > なんかワールドデータのlevel.datファイルなどが文字化けしてました。
            > これって元からなのでしょうか?

            level.datはテキストファイルではないので、catとかで中身をみても文字化けしてしまいます。

          • YYYY より:

            実は、実験用で自分のPCでサーバー立ててやってみたんですけど、
            しっかりできるんですよ

          • YYYY より:

            あと、java版のワールドってどうゆう意味ですか?
            spigotサーバーで建てたやつを、VPSのほうに送っちゃダメなんですか?

          • tamohiko より:

            spigotからspigotであれば問題ありません。

          • YYYY より:

            VPS内で作られたworldしかちゃんと動いてくれないんですよね
            でも、自分のPCで建てたらできるっていう、、、

          • YYYY より:

            1.12.2 OFのファイルから spigot
            そのspigotからvps spigot
            でも行けますよね?

          • tamohiko より:

            1.12.2 OFのOFが何なのかが良くわかりませんが、1.12.2 OFからspigotにワールドデータをコピーして正常に動作することを確認後に、そのワールドデータをVPS上のspigotにワールドデータをコピーという事でしょうか?

            1.12.2 OFからワールドデータをコピーしたspigotとVPS上のspigotの環境(バージョン等)が同じであれば大丈夫だと思います。

            VPSへワールドデータをコピーする際にデータが破損していないかMD5ハッシュ値をコピー元とコピー先で比較してみてください。
            CentOSなら「md5sum」コマンドで確認できます。

            md5sum level.dat

            ちなみに、ワールドデータのコピーはどちらのspigotも停止してから行っていますよね?

          • YYYY より:

            level.dat: No such file or directory
            とでてきました。

          • YYYY より:

            あとサーバーを停止中って、spigotですよね?
            VPS自体は止めなくてもいいんですよね?

          • YYYY より:

            —- Minecraft Crash Report —-
            // My bad.

            Time: 3/12/20 6:48 AM
            Description: Exception in server tick loop

            java.lang.RuntimeException: Failed to check session lock for world located at ./world, aborting. Stop the server and delete the session.lock in this world to prevent further issues.
            at net.minecraft.server.v1_12_R1.WorldNBTStorage.i(WorldNBTStorage.java:63)
            at net.minecraft.server.v1_12_R1.WorldNBTStorage.(WorldNBTStorage.java:47)
            at net.minecraft.server.v1_12_R1.ServerNBTManager.(SourceFile:21)
            at net.minecraft.server.v1_12_R1.MinecraftServer.a(MinecraftServer.java:265)
            at net.minecraft.server.v1_12_R1.DedicatedServer.init(DedicatedServer.java:272)
            at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:545)
            at java.lang.Thread.run(Thread.java:748)

            A detailed walkthrough of the error, its code path and all known details is as follows:
            —————————————————————————————

            — System Details —
            Details:
            Minecraft Version: 1.12.2
            Operating System: Linux (amd64) version 3.10.0-1062.12.1.el7.x86_64
            Java Version: 1.8.0_242, Oracle Corporation
            Java VM Version: OpenJDK 64-Bit Server VM (mixed mode), Oracle Corporation
            Memory: 886652576 bytes (845 MB) / 1029177344 bytes (981 MB) up to 1029177344 bytes (981 MB)
            JVM Flags: 2 total; -Xms1024M -Xmx1024M
            IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
            CraftBukkit Information:
            Running: CraftBukkit version git-Spigot-79a30d7-acbc348 (MC: 1.12.2) (Implementing API version 1.12.2-R0.1-SNAPSHOT) true
            Plugins: { PermissionsEx v1.23.4 ru.tehkode.permissions.bukkit.PermissionsEx [[t3hk0d3, zml]], WorldEdit v6.1.9;caf0ad9 com.sk89q.worldedit.bukkit.WorldEditPlugin [], Vault v1.7.2-b107 net.milkbowl.vault.Vault [cereal, Sleaker, mung3r], Essentials v2.17.2.0 com.earth2me.essentials.Essentials [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits, md_5, Iaccidentally, drtshock, vemacs, SupaHam, md678685], MyCommand v5.6.1 it.mri.mycommand.Main [emmerrei a.k.a Ivanpro], WorldGuard v6.2.2-SNAPSHOT;8eeab68 com.sk89q.worldguard.bukkit.WorldGuardPlugin [], Multiverse-Core v2.5.0-b727 com.onarandombox.MultiverseCore.MultiverseCore [Rigby, fernferret, lithium3141, main–, dumptruckman], LunaChat v2.8.9 com.github.ucchyocean.lc.LunaChat [ucchy],}
            Warnings: DEFAULT
            Reload Count: 0
            Threads: { TIMED_WAITING Spigot Watchdog Thread: [java.lang.Thread.sleep(Native Method), org.spigotmc.WatchdogThread.run(WatchdogThread.java:92)], RUNNABLE DestroyJavaVM: [], RUNNABLE Server thread: [java.lang.Thread.dumpThreads(Native Method), java.lang.Thread.getAllStackTraces(Thread.java:1610), org.bukkit.craftbukkit.v1_12_R1.CraftCrashReport.call(CraftCrashReport.java:30), net.minecraft.server.v1_12_R1.CrashReportSystemDetails.a(SourceFile:78), net.minecraft.server.v1_12_R1.CrashReport.h(CrashReport.java:128), net.minecraft.server.v1_12_R1.CrashReport.(CrashReport.java:35), net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:597), java.lang.Thread.run(Thread.java:748)], WAITING Snooper Timer: [java.lang.Object.wait(Native Method), java.lang.Object.wait(Object.java:502), java.util.TimerThread.mainLoop(Timer.java:526), java.util.TimerThread.run(Timer.java:505)], WAITING Reference Handler: [java.lang.Object.wait(Native Method), java.lang.Object.wait(Object.java:502), java.lang.ref.Reference.tryHandlePending(Reference.java:191), java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)], WAITING NonBlockingInputStreamThread: [java.lang.Object.wait(Native Method), org.bukkit.craftbukkit.libs.jline.internal.NonBlockingInputStream.run(NonBlockingInputStream.java:278), java.lang.Thread.run(Thread.java:748)], TIMED_WAITING Server Infinisleeper: [java.lang.Thread.sleep(Native Method), net.minecraft.server.v1_12_R1.DedicatedServer$1.run(DedicatedServer.java:60)], TIMED_WAITING Timer-0: [java.lang.Object.wait(Native Method), java.util.TimerThread.mainLoop(Timer.java:552), java.util.TimerThread.run(Timer.java:505)], RUNNABLE Signal Dispatcher: [], RUNNABLE Server console handler: [java.io.FileInputStream.readBytes(Native Method), java.io.FileInputStream.read(FileInputStream.java:255), java.io.BufferedInputStream.fill(BufferedInputStream.java:246), java.io.BufferedInputStream.read(BufferedInputStream.java:265), org.bukkit.craftbukkit.libs.jline.internal.NonBlockingInputStream.read(NonBlockingInputStream.java:169), org.bukkit.craftbukkit.libs.jline.internal.NonBlockingInputStream.read(NonBlockingInputStream.java:137), org.bukkit.craftbukkit.libs.jline.internal.NonBlockingInputStream.read(NonBlockingInputStream.java:246), org.bukkit.craftbukkit.libs.jline.internal.InputStreamReader.read(InputStreamReader.java:261), org.bukkit.craftbukkit.libs.jline.internal.InputStreamReader.read(InputStreamReader.java:198), org.bukkit.craftbukkit.libs.jline.console.ConsoleReader.readCharacter(ConsoleReader.java:2145), org.bukkit.craftbukkit.libs.jline.console.ConsoleReader.readLine(ConsoleReader.java:2349), net.minecraft.server.v1_12_R1.DedicatedServer$2.run(DedicatedServer.java:85)], RUNNABLE Netty Epoll Server IO #0: [io.netty.channel.epoll.Native.epollWait0(Native Method), io.netty.channel.epoll.Native.epollWait(Native.java:114), io.netty.channel.epoll.EpollEventLoop.epollWait(EpollEventLoop.java:235), io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:252), io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884), java.lang.Thread.run(Thread.java:748)], TIMED_WAITING ObjectCleanerThread: [java.lang.Object.wait(Native Method), java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144), io.netty.util.internal.ObjectCleaner$1.run(ObjectCleaner.java:54), io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30), java.lang.Thread.run(Thread.java:748)], TIMED_WAITING process reaper: [sun.misc.Unsafe.park(Native Method), java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215), java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:460), java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362), java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:941), java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1073), java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134), java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624), java.lang.Thread.run(Thread.java:748)], WAITING Finalizer: [java.lang.Object.wait(Native Method), java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144), java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165), java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)], WAITING Thread-4: [sun.misc.Unsafe.park(Native Method), java.util.concurrent.locks.LockSupport.park(LockSupport.java:175), java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039), java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442), com.mojang.util.QueueLogAppender.getNextLogEvent(QueueLogAppender.java:77), org.bukkit.craftbukkit.v1_12_R1.util.TerminalConsoleWriterThread.run(TerminalConsoleWriterThread.java:27), java.lang.Thread.run(Thread.java:748)],}
            Recent tasks from -31–1{}
            Profiler Position: N/A (disabled)
            Player Count: 0 / 20; []
            Is Modded: Definitely; Server brand changed to ‘Spigot’
            Type: Dedicated Server (map_server.txt)

  16. YYYY より:

    [09:49:20 ERROR]: Failed to save chunk
    java.lang.NullPointerException: null
    at net.minecraft.server.v1_12_R1.RegionFile.a(RegionFile.java:200) ~[spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
    at net.minecraft.server.v1_12_R1.RegionFile$ChunkBuffer.close(RegionFile.java:304) ~[spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
    at java.util.zip.DeflaterOutputStream.close(DeflaterOutputStream.java:241) ~[?:1.8.0_242]
    at java.io.FilterOutputStream.close(FilterOutputStream.java:159) ~[?:1.8.0_242]
    at java.io.FilterOutputStream.close(FilterOutputStream.java:159) ~[?:1.8.0_242]
    at net.minecraft.server.v1_12_R1.RegionFileCache.e(RegionFileCache.java:95) ~[spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
    at net.minecraft.server.v1_12_R1.ChunkRegionLoader.b(ChunkRegionLoader.java:212) ~[spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
    at net.minecraft.server.v1_12_R1.ChunkRegionLoader.processSaveQueueEntry(ChunkRegionLoader.java:195) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
    at net.minecraft.server.v1_12_R1.ChunkRegionLoader.a(ChunkRegionLoader.java:167) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
    at net.minecraft.server.v1_12_R1.FileIOThread.c(SourceFile:37) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
    at net.minecraft.server.v1_12_R1.FileIOThread.run(SourceFile:30) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_242]

  17. YYYY より:

    基本的に、パーミッションはどうすればいいんですか?
    すべてrootから変えたんですけどそれでもだめなんですか?

    • tamohiko より:

      > level.dat: No such file or directory
      > とでてきました。

      level.datがあるディレクトリでコマンド実行しましたか?

      > あとサーバーを停止中って、spigotですよね?
      > VPS自体は止めなくてもいいんですよね?

      はいspigotを停止してあれば問題ありません。

      > 基本的に、パーミッションはどうすればいいんですか?
      > すべてrootから変えたんですけどそれでもだめなんですか?

      rootからどのユーザに変えました?
      spigotをインストールおよび動作させているユーザと同じにしてあれば問題ないと思いますが。

      たとえばこのページの手順通りspigotのインストール行った場合、「spiadmin」というユーザを作成してインストールしているので、「world」ディレクトとその中のデータは、ユーザとグループともに「spiadmin」に設定しておく必要があります。

  18. 加藤 より:

    こんばんは。
    自動起動設定ファイル作成が出来ません。
    ファイルを編集し、:wq!で保存した所
    “/etc/systemd/system/spigot.service” E212:Can’t open file for writing
    Press ENTER or type command to continue
    というメッセージが表示され保存出来ません。
    解決方法などがあればご教示願います。

    • tamohiko より:

      加藤さん

      コメントありがとうございます。

      > E212:Can’t open file for writing Press ENTER or type command to continue

      このエラーはviで書き込み権限がないのに、保存しようとした場合に表示されるメッセージです。

      「/etc/systemd/system/」ディレクトリは、rootユーザのみしか書き込み権限がないので、
      自動起動設定用のファイルを作成するときは、rootユーザで作業を行う必要があります。

      もし、一般ユーザで作業している場合はrootユーザでファイルの作成を行ってみてください。

  19. すめし より:

    すいません、起動パッチを設定して、コンソールで起動コマンド打ってみたんですけど、Starting spigot-1.12.2.jar…しかでなくて、サーバーが読み込まれてるログが出てこないんですけどどうせれば解決できますか?

    • tamohiko より:

      すめしさん

      コメントありがとうございます。
      これは起動用のスクリプトを実行してもspigotのサーバが起動しないという認識で良いでしょうか?

      screenの仮想端末には接続(Attach)できますか?
      出来ているのであれば、そこに何かログが表示されていないか確認お願いします。

      screenの仮想端末には接続(Attach)出来ない場合は、起動スクリプトを実行する際に「-x」オプションを指定してから実行すると、上手く動作しない原因がわかるかもしれません。

      サイトで解説している手順で
      $ ./spi_start.sh
      と実行している部分を下記のようにしてみてください。
      $ sh -x ./spi_start.sh

      これで、シェルスクリプトの実行状況が詳しく表示されるようになるため、そこから問題がある部分が分かるかもしれません。

    • すめし より:

      ごめんなさい自分で解決できました

  20. LL より:

    シェルスクリプトで自動再起動ってできませんか?
    while true
    do
    screen java -jar -Xms3072M -Xmx3072M -jar spigot-1.16.4.jar
    sleep 5
    done

    これを試してみて自動再起動はできたのですが、screenじゃなくていろいろ使いづらいんです。どうすればscreenで起動できますか?

    • LL より:

      ごめんなさい><
      勝手ながら質問変えさせていただきます。
      自動再起動のユニットがうまく働いてくれません。
      loaded: loadedになってはいますが systemctl enable spigot.service をやって
      systemctl status spigot.service で確認すると Active: failed (Result: start-limit)
      と出てきて失敗してるんです。

      • LL より:

        あと /stop と打って一回サーバー止まってすぐにまた動き出すスクリプトもお願いしたいです><
        本当に厚かましくて申し訳ありません。

        • tamohiko より:

          LL さん

          コメントありがとうございます。

          スクリプトではないのですが、sysytemdでspigotの自動起動を行っているのであれば、spi君さんからの質問に返答した方法で自動で起動するように設定を行うことが出来ますが、いかかでしょうか?

      • tamohiko より:

        LLさん

        この内容だけではエラーの原因が絞り切れませんので、spigot.serviceの内容とsystemctl status で表示されているログを教えていただくことはできますか?

  21. spi君 より:

    こんにちは!
    spigotサーバーがクラッシュなどで落ちてしまった場合どうやって自動起動させればいいですか?
    ご教授いただければ幸いです。

    • tamohiko より:

      spi君 さん

      コメントありがとうございます。

      このページの手順でspigotが構築されていることを前提となりますが、「/etc/systemd/system/spigot.service」ファイルの[Service]部分に、「Restart=always」を追加することでプロセスが落ちた際に再起動してくれるようになるはずです。

      spigotを意図的にクラッシュさせる方法が分からなかったので、stopコマンドでサービスを停止させた後に自動的に再起動することは確認できました。

      [Service]
      Type=forking
      User=spiadmin
      ExecStart=/opt/spigot/spi_start.sh
      ExecStop=/opt/spigot/spi_stop.sh
      Restart=always ### 追加します。

      設定を追加した後は下記コマンドを実行して設定を反映させてください。

      # systemctl daemon-reload

      【注意点】
      この設定を行うと、stopコマンドでspigotを停止させてもすぐに再起動してしまうため、このままではspigotを停止させることが出来なくなってしまいます。
      ですので、メンテナンス等で完全に停止させたい場合は下記の作業を行った後に停止させる必要がありますので注意してください。

      ・ Restart=alwaysの設定を削除
      ・ 「systemctl daemon-reload」コマンドで設定反映

      以上、よろしくお願いします。

  22. spi君 より:

    systemctl status spigot.service を実行したところこのようなログが出てきました。

    Loaded: loaded (/etc/systemd/system/spigot.service; vender preset: disabled)
    Active: failed (Result: start-limit)

    systemd[1] Failed to start Minecraft Server (spigot).
    systemd[1] Unit spigot.service entered failed state.
    systemd[1] spigot.service failed
    systemd[1] spigot.service holdoff time over, scheduling restart.
    systemd[1] stopped Minecraft Server (spigot).
    systemd[1] start request repeated too quickly for spigot.service
    systemd[1] Failed to start Minecraft Server (spigot).
    systemd[1] Unit spigot.service entered failed state.
    systemd[1] spigot.service failed.

    • spi君 より:

      クラッシュ時(Spigot)の自動再起動はshファイルの内容を変えてできるようになりました。
      ですがやっぱりサーバー起動時(CentOS7のサーバー起動時)に自動でshを起動できるようにはできませんでした。

      • spi君 より:

        サーバー起動してすぐに screen -ls を使用してみたら 859.spigot (Dead ???)
        となっていました。

  23. spi君 より:

    ちなみに内容は
    [Unit]
    After=network-online.target

    [Service]
    User=lol
    ExecStart=/opt/spigot/Runserver.sh

    [Install]
    WantedBy=multi-user.target

    です。

    • spi君 より:

      ごめんなさい。すべて自己解決できました。
      お忙しい中返信ありがとうございました。

      • spi君 より:

        あーでもCentos7が起動したらspigotも動くようにはなりましたが、そこでrestartしてもまた起動してくれません。

        #!/bin/bash
        cd /opt/spigot
        screen -AmdS spigot java -Xmx3072M -Xms3072M -jar spigot-1.16.4.jar nogui

        これをshに記述してます。

        • tamohiko より:

          sysytemdへの登録用ファイルについてですが、停止の処理が記述されていないようですが、なにか意図があってのことなのでしょうか?

          この設定だと、サーバの停止や再起動の際に手動でspigotを停止させる必要があるので、手間がかかってしまうような気がします。

          > そこでrestartしてもまた起動してくれません。

          restartとは何を指していますか?
          サーバの再起動ですか、それともsystemctlでのrestartでしょうか?
          systemctlでrestartできないのはsystemdへの登録用ファイルにstopの処理が無いのが原因かもしれません。

          • spi君 より:

            ごめんなさい。このserviceファイルにrestart記述したら普通に動作しました…
            何度も質問してしまい申し訳ありませんでした。

          • spi君 より:

            あとcrontabからサーバーに定期的にコマンドを送ることは可能なのでしょうか?

          • tamohiko より:

            サーバというのはspigotサーバということでよいですか?

            screen上で動作しているのであれば、このページに記載されているspigotの停止スクリプト内にある「screen -p 0 -S $SCNAME -X eval ‘stuff “stop”\015’」コマンドを応用すれば可能だと思いますよ。

            下記の部分を適宜変更してみてください。

            $SCNAME 部分をscreen名に変更
            stop 部分を実行したいコマンド

          • spi君 より:

            あとやっぱり自動再起動(spigot)できてませんでした。
            systemdのファイルをこのWEBのやつに変えてやっても
            Loaded: loaded
            Active: failed (Result: start-limit)
            と出てきました。

          • tamohiko より:

            > systemdのファイルをこのWEBのやつに変えてやっても

            ということはスタートと停止用のスクリプトそれぞれ作成して、systemdの設定ファイルを作成しているという認識で良いでしょうか?

            であれば、まずスタートと停止のスクリプト単体で動作テストした結果はどうでしたか?

            もしその段階で動作しないのであればシェル実行時にsh -x ./spi_start.sh というように「-x」オプションを指定して実行すると実行途中の状況も表示されるようになりますので、どこでエラーが発生しているのかを判断しやすくなります。

            スクリプト単体での動作に問題がないのであれば、systemdのログになにかエラーなどの情報は表示されていないか確認してみて下さい。

          • spi君 より:

            start,stopどちらとも正常に起動します。

          • spi君 より:

            systemdのログの確認はどうすればいいですか?

          • tamohiko より:

            下記のコマンドでログを表示させることができます。

            # journalctl -u spigot.service

            あとは、/var/log/messages にもログは表示されていると思いますので、こちらもあわせて確認してみて下さい。

          • spi君 より:

            — No entries — と書いてあります

          • tamohiko より:

            systemdへの登録要ファイルの名前は「spigot.service」となっていますか?
            もし違う名前で登録してあるのであれば、その名前で実行してみて下さい。

            あと、「systemctl start spigot」や「systemctl stop spigot」などは問題なく実行できるかもためしてみて下さい。
            spigotの部分はsystemdに登録した際の名前に適宜読み替えて下さい。

          • spi君 より:

            Job for spigot.service failed because the control process exited with error code. See “systemctl status spigot.service” and “Journalctl -xe” for details. とでてきました

          • tamohiko より:

            spigotのサービスを実行する際にエラーが出ていますね。
            下記コマンドでエラーの原因となりそうなログは表示されませんか?

            # systemctl status spigot.service

            あと、/var/log/messages も確認してみて下さい。

            下記コマンドでsystemdへの登録ファイルの内容が表示されるので、そちらの内容も教えていただけますか。

            # systemctl cat spigot.service

          • spi君 より:

            [Unit]
            Description=Minecraft Server (spigot)
            After=network.target local-fs.target

            [Service]
            Type=forking
            User=lol
            ExecStart=/opt/spigot/spi_start.sh
            ExecStop=/opt/spigot/spi_stop.sh

            [Install]
            WantedBy=multi-user.target

            です

          • spi君 より:

            systemctl status spigot.service を実行したところ、
            * spigot.service – Minecraft Server (spigot)
            Loaded: loaded (/etc/systemd/system/spigot.service; enabled; vendor preset: disabled)
            Active: failed (Result: exit-code) since 土 2021-04-03 21:42:23 JST; 9h ago
            Process: 16724 ExecStart=/opt/spigot/spi_start.sh (code=exited, status=203/EXEC)

            4月 03 21:42:23 tk2-255-37304.vs.sakura.ne.jp systemd[1]: Starting Minecraft Server (spigot)…
            4月 03 21:42:23 tk2-255-37304.vs.sakura.ne.jp systemd[1]: spigot.service: control process exited, code=exited status=203
            4月 03 21:42:23 tk2-255-37304.vs.sakura.ne.jp systemd[1]: Failed to start Minecraft Server (spigot).
            4月 03 21:42:23 tk2-255-37304.vs.sakura.ne.jp systemd[1]: Unit spigot.service entered failed state.
            4月 03 21:42:23 tk2-255-37304.vs.sakura.ne.jp systemd[1]: spigot.service failed.

          • tamohiko より:

            この部分でエラーが発生しているみたいです。
            ExecStart=/opt/spigot/spi_start.sh

            /var/log/messegesの2021-04-03 21:42:23あたりのログにもう少し詳しい情報はありませんでしたか?

            また、spigotが停止されている状態で、lolユーザにて「/opt/spigot/spi_start.sh」を実行して問題なく動作するか試してみて下さい。

          • spi君 より:

            21:42:23 のログがないです

          • spi君 より:

            あとlolユーザーで起動はできます

          • spi君 より:

            もう一度やってみたところ

            Apr 4 18:54:46 tk2-255-37304 systemd: Configuration file /etc/systemd/system/spigot.service is marked executable. Please remove executable permission bits. Proceeding anyway.
            Apr 4 18:54:46 tk2-255-37304 systemd: Configuration file /etc/systemd/system/spigot.service is marked world-writable. Please remove world writability permission bits. Proceeding anyway.
            Apr 4 18:54:46 tk2-255-37304 systemd: Reloading.
            Apr 4 18:54:46 tk2-255-37304 systemd: Configuration file /etc/systemd/system/spigot.service is marked executable. Please remove executable permission bits. Proceeding anyway.
            Apr 4 18:54:46 tk2-255-37304 systemd: Configuration file /etc/systemd/system/spigot.service is marked world-writable. Please remove world writability permission bits. Proceeding anyway.
            Apr 4 18:54:53 tk2-255-37304 systemd: Configuration file /etc/systemd/system/spigot.service is marked executable. Please remove executable permission bits. Proceeding anyway.
            Apr 4 18:54:53 tk2-255-37304 systemd: Configuration file /etc/systemd/system/spigot.service is marked world-writable. Please remove world writability permission bits. Proceeding anyway.
            Apr 4 18:55:03 tk2-255-37304 systemd: Starting Minecraft Server (spigot)…
            Apr 4 18:55:03 tk2-255-37304 systemd: Failed at step EXEC spawning /opt/spigot/spi_start.sh: Exec format error
            Apr 4 18:55:03 tk2-255-37304 systemd: spigot.service: control process exited, code=exited status=203
            Apr 4 18:55:03 tk2-255-37304 systemd: Failed to start Minecraft Server (spigot).
            Apr 4 18:55:03 tk2-255-37304 systemd: Unit spigot.service entered failed state.
            Apr 4 18:55:03 tk2-255-37304 systemd: spigot.service failed.

          • tamohiko より:

            ・エラーログについて
            表示されているエラーログについていくつか質問させて下さい。

            > systemd: Configuration file /etc/systemd/system/spigot.service is marked executable. Please remove executable permission bits. Proceeding anyway.

            下記ファイルのパーミッションは644になっているか確認してみて下さい。
            /etc/systemd/system/spigot.service

            > /opt/spigot/spi_start.sh: Exec format error

            「/opt/spigot/spi_start.sh」スクリプトファイルの先頭に下記の記述があるか確認お願いします。

            #!/bin/bash

            「/opt/spigot/spi_start.sh」「/opt/spigot/spi_stop.sh」のパーミッションにて実行権限が付与されているかの確認もお願いします。

            ・systemdの動作について
            > あと、「systemctl start spigot」や「systemctl stop spigot」などは問題なく実行できるかもためしてみて下さい。

            rootユーザでこちらを実行した際の結果についても教えていただけますか?

          • spi君 より:

            active active (running) になりました

          • spi君 より:

            しっかり起動しました。ご教授ありがとうございました。あともしよかったらcrontabでminecraftに定期的にコマンドを送る方法を教えてほしいです。

          • tamohiko より:

            無事起動したようで何よりです。

            > あともしよかったらcrontabでminecraftに定期的にコマンドを送る方法を教えてほしいです。

            screen上で動作しているspigotへコマンドを送信する方法は以前のコメントで回答していると思いますが、その方法でコマンドを送信はできましたか?

            > screen上で動作しているのであれば、このページに記載されているspigotの停止スクリプト内にある「screen -p 0 -S $SCNAME -X eval ‘stuff “stop”\015’」コマンドを応用すれば可能だと思いますよ。

            > 下記の部分を適宜変更してみてください。

            > $SCNAME 部分をscreen名に変更
            > stop 部分を実行したいコマンド

            実行できたのであれば「/etc/crontab」に設定することで定期的にコマンドを実行させることができす。

            「/etc/crontab」設定例

            毎月1日6:00にワールドを再作成させたい場合は、下記のような設定となります。

            0 6 1 * * spiadmin 実行させたいコマンド

            まずは、ちょっと先の日時を設定して動作確認を行ってみてください。
            それで問題なく動作するようでしたら、希望する日時を設定してください。

            /etc/crontabの設定方法については下記のページで説明していますので参考にしてみて下さい。

            https://www.server-memo.net/tips/etc-crontab.html

          • spi君 より:

            screen -p 0 -S spigot -X eval ‘stuff “say test”\015’
            とやってみたのですが反応ありません

          • spi君 より:

            ごめんなさい。できました。
            色々教えてくださり本当にありがとうございました。

          • spi君 より:

            あーでもsh(stop.sh)で日本語にしてやると文字化けします

  24. spi君 より:

    何度も質問すみません。
    while true
    do
    screen -AmdS spigot java -jar -Xms3072M -Xmx3072M -jar spigot-1.16.4.jar &
    sleep 5
    done

    を記述したshを起動させ、 screen -ls で見てみたら

    1620.spigot (Detached)
    1594.spigot (Detached)
    1568.spigot (Detached)

    とどんどん増えてしまいます。

    • tamohiko より:

      この内容だとscreen上でspigotを起動したあとに5秒sleepさせて、停止処理を行わずにまた同様に起動を繰り替えすという動作になると思います。

      ですので、spigotの停止処理を行わずに起動を行っているのが原因ではないでしょうか?

      このスクリプトはどのような動作を想定しているのですか?

      • spi君 より:

        ごめんなさい。やはりsystemdのほうを教わりたいです。厚かましくて申し訳ありません。

  25. spi君 より:

    返信大変なので新しく作ります。

    [Server] 残り1秒でサーバーが停止します

    [Server] 罧??1腱???泣???????罩≪??障?
    というように文字化けしてしまいます。

    • tamohiko より:

      メッセージの文字化けについていくつか確認してみてください。

      ・Minecraftのゲーム内で表示されているメッセージも文字化けしていますか?

      ・ロケール設定も確認してみてください。
      ja_JP.UTF-8以外に設定されている場合はscreen上で文字化けしてしまうかもしれません。
      確認方法は下記のページを参考にしてみて下さい。

      https://www.server-memo.net/centos-settings/system/user-locale.html

      • spi君 より:

        関係ないのですがsu – root をやろうとすると
        su: failed to execute /bin/bash: リソースが一時的に利用できません
        とでてきます

      • spi君 より:

        ごめんなさい。suのことに関しては解決しました

      • spi君 より:

        できました!ありがとうございます

      • spi君 より:

        でもやっぱりcrontabで反応してくれません

        • tamohiko より:

          /etc/crontabで設定を行っているのであれば、「/var/log/cron」に何かログは出力されていませんか?

          • spi君 より:

            忙しくて作業と返信ができていませんでした。
            ログに関しては
            crond[628]: (*system*) RELOAD (/etc/crontab)
            があります

          • tamohiko より:

            ログの状況からすると何も実行されていないように見えますが、どのように「/etc/crontab」の設定をされていますか?

  26. spi君 より:

    0 0 * * * lol screen -p 0 -S spigot -X eval ‘stuff “say test”\015’

    こんな感じです

    • tamohiko より:

      設定をみたところ、0時0分にlolユーザでコマンドを実行する設定だと思いますが、その時間のログになにもなかったのでしょうか?

      • spi君 より:

        何もありません

        • tamohiko より:

          では、問題の切り分けとして「screen -p 0 -S spigot -X eval ‘stuff “say test”\015’」の部分を「logger test」に変更して、実行されるか確認して頂けますか?

          「logger test」というコマンドは、「/var/log/messages」に「test」というログを出力させるコマンドになります。

          これで動作すれば「screen -p 0 -S spigot -X eval ‘stuff “say test”\015’」部分に問題があるということになり、動作しなかった場合は日時の指定部分か実行ユーザの設定に問題がるということになりますので、どこを修正すれば良いのかが絞り込めると思います。

          あと、念のために確認させて頂きたいのですが、「screen -p 0 -S spigot -X eval ‘stuff “say test”\015’」コマンドを直接入力した際には問題なく動作しているのですよね?

          • spi君 より:

            バイトで忙しくて返信できていませんでした。ごめんなさい。
            logger test を実行したところmessageにtestと表示されました
            あとコマンドですが、上のやつだと反応しなくて、「screen -p 0 -S spigot -X eval ‘stuff “say test”\015’」だと手打ちで反応したんです。

          • tamohiko より:

            > バイトで忙しくて返信できていませんでした。ごめんなさい。

            バイトおつかれさまです!
            全然気にしないで下さい。

            > logger test を実行したところmessageにtestと表示されました

            ということは、crontabのスケジュール設定は問題がないようですね。

            > あとコマンドですが、上のやつだと反応しなくて、「screen -p 0 -S spigot -X eval ‘stuff “say test”\015’」だと手打ちで反応したんです。

            wordpressのコメント欄はなんか勝手にクォーテーション等が勝手にへんな風に変換されるみたいなので、crontabに設定する際はコメント欄からコピーせずに、コンソールで実際に動作したものをコンソール上からコピーするか、手動で実行させたいコマンドを設定して試してみてください。

          • spi君 より:

            訂正:上のものをコピーしたものだと何も起こらなかったです

          • spi君 より:

            手打ちで実行できたやつをcrontabに設定してもserver側には何も来ませんでした

          • tamohiko より:

            crontabの実行ログには何か表示されていましたか?

            スケジュール設定については「logger」コマンドでの検証時には実行されていたので問題ないと思います。
            ですので、コマンドの部分の設定方法に問題があるのだと思われます。

            私の環境では、下記のように設定したところ毎時45分にspigotサーバにtestというメッセージを送ることが出来ました。
            設定内容で何か異なる点はありますか?

            spigotの実行ユーザ spiadmin
            screen名 spigot

            /etc/crontab設定

            45 * * * * spiadmin screen -p 0 -S spigot -X eval 'stuff "say test"\015'

            ※上記の設定ですが、今回はcodeタグで囲ってみたので、クォーテーションのwordpressによる自動変更は行われていないと思います。

          • spi君 より:

            やってみます

タイトルとURLをコピーしました