「さくらの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」が自動的に起動してくるか確認してください。
無事起動してきましたら、インストール作業は完了となります。
コメント
手順通りに行い、
./spi_start.shを実行しようとしているのですが
spigot-1.8.8.jar was not runnning.
と出て実行できません。
解決方法をご教授ください。
匿名希望さん
ご質問ありがとうございます。
> ./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”
と逆に指定していたためと分かりました。
値を正しくしたところ起動することができました。
匿名希望さん
返信ありがとうございます。
無事起動できたようで何よりです。
また、原因につきましてもお教えいただき、ありがとうございました。
これから始まるマイクラライフをお楽しみくださいね!
こんにちは
質問させてください
ひととおり手順通りにでき、手動で起動スクリプトと停止スクリプトも無事にできましたが、「自動起動設定」が出来ない状態です。
# systemctl enable spigot.service と打つと
Failed to execute operation: Invalid argument と出てしまいます。
確認する点などありましたらよろしくお願いします。
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」を実行してみてください。
tamohikoさん
さっそくのご返答ありがとうございます。確認いたしましたところ
「/etc/systemd/system/multi-user.target.wants」ディレクトリに「spigot.service」ファイルはありませんでした。
「/etc/systemd/system」に「spigot.service」ファイルが存在している状態です。
何度も申し訳ありません。
よろしくお願いします。
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になる原因についてはもう少し調べてみます。
手順どうりに進めてるんですけど、起動スクリプト実行確認の場所で躓いてます。
./spi_start.shのところはうまく行ってるんですけどその後のscreenの確認で”screen -ls”のコマンド打ったところscreen -ls
“No Sockets found in /var/run/screen/S-spiadmin.”と返されてしまいます。どうしたらいいですか?
Reaperさん
コメントありがとうございます。
spi_start.shでspigot自体は起動できていますか?
出来ていないようでしたら、スクリプトに何らかの間違いがあると思いますので、再度確認してみて下さい。
スクリプトを実行する際に「-x」を付けて実行すると、実行状況が表示されるので、原因調査の役に立つと思います。
あと確認する点としては、「SERVICE=」の部分で設定しているjarファイル名は間違いないか、「SPI_PATH=」で指定しているディレクトに間違いがないかも確認してみてください。
「SPI_PATH=」で指定しているディレクトは、spigot.jerがある場所の指定ですよね
Reaperさん
> 「SPI_PATH=」で指定しているディレクトは、spigot.jerがある場所の指定ですよね
はい、そのとおりです。
Serverは開いたんですけど、前のワールドをVPSサーバーに入れたらすぐにサーバーが閉じてしまいます、どうしたらいいですか?
Reaperさん
状況をもう少し詳しく教えていただけますでしょうか。
> Serverは開いたんですけど
これはspigot自体は起動しているということですか。
> 前のワールドをVPSサーバーに入れたらすぐにサーバーが閉じてしまいます
サーバが閉じてしまうとはクライアントから入れないという事でしょうか?
それとも、spigot自体が終了してしまうという事ですか?
現在の情報だけですと、何が起きているのかが分からないので、
logsフォルダにあるログを確認して頂けますでしょうか。
そちらを確認することで、もう少し詳しい情報や原因がわかるかもしれません。
以上、よろしくお願いいたします。
[Server thread/INFO]: Saving worldsのところでServerが閉じてしまいます
Reaperさん
> [Server thread/INFO]: Saving worldsのところでServerが閉じてしまいます
調査ありがとうございます。
ただ、このメッセージだけでは原因が分からないので、
お手数をおかけしますが、もう少し詳しい情報を教えてください。
spigotの起動に失敗するという事は、
ログの中にERRORとかWARNレベルのログが表示されていると思うのですが、
それらに関連するログを教えてください。
ソースはオープンソースですか?
rootさん
コメントありがとうございます。
お返事遅れてすいません。
spigotのソースということでしょうか?
であれば、オープンソースですよ。
詳しくは公式サイトをご確認いただくと詳しい情報が記述されています。
https://www.spigotmc.org/wiki/about-spigot/
サーバーの動作確認のところで
サーバーログインしようとすると
クライアント側でio.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused:
とエラーメッセージが表示されます……
keryさん
コメントありがとうございます。
エラーメッセージに「Connection refused:」と出ているので、何らかの理由で接続が拒絶されているみたいですね。
原因の切り分けとして、いったんクライアント側OSのファイアウォールを停止して接続できるか確認してみることはできますか?(確認後はファイアウォールの再開を忘れずに行ってください)
もし、これで接続できるようであれば、ファイアウォールが原因であると考えられるので、ファイアウォールの設定でjavaが許可されているか確認してみてください。
ファイヤーオールの設定をいじったら接続ができました。
ありがとうございます!!
問題が解決されたみたいでよかったです!!
間違えて全てrootフォルダに保存してしまったのですが、その場合スクリプトの設定はどこを変えればいいのでしょうか?
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」ユーザで実行することはセキュリティの関係からおすすめできませんので、どこか別のディレクトリに移動させて運用するほうが良いのではないかと思います。
/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
野崎さん
コメントとありがとうございます。
問題は無事解決されたようでなによりです。
> ロビーサーバ用のポートと、ミニゲームサーバ用のポートが同じになってしまっていたため、起動直後にstopしてたみたいです。。。
ポートの衝突はよくやりがちな失敗ですよね。
私もたまに同じようなことをやってしまいます。
> あとstart.shはこれにかえました
死活監視してくれるのはとても便利ですね!
ご紹介ありがとうございました。
ちなみに、systemdの機能でも同様のことができたりします。
(野崎さんが思い描いている動作と異なるかもしれませんが)
systemd用の自動起動設定ファイルの[Service]欄に「Restart=always」という設定を追加することで、サービスが終了した場合に自動的に再起動してくれるようになります。
[Service]
Restart=always
ただし、この設定をいれるとサーバを停止させることが出来なくなるので私は設定していません…
その点、紹介していただいたスクリプトの方がminecraftサーバを停止させやすくて使い勝手が良さそうですね。
すみません。記事の通り設定を進めてサーバー起動も問題なく出来ましたが、起動スクリプトの作成がうまくいかないので教えてほしいです。
使用しているvpsはconohaで、spigotは1.12.2を使用しています。
http://or2.mobi/index.php?mode=image&file=189454.jpg
画像のように設定しており、スクリプトを実行すると「Starting spigot-1.12.2.jar…」となるだけで、サーバーが起動しません。
スクリプトを使用しない起動方法はうまくいくのですが、何がいけないんでしょうか?
sasaさん
コメントありがとうございます。
起動スクリプトの件ですが、スクリプト実行後に「logs」フォルダ内の「latest.log」ファイルを確認してみてください。
何か起動しない原因が表示されているかも知れません。
また、スクリプトを実行する際に「$ sh -x spi_start.sh」といったように「-x」を指定してスクリプトを実行するとスクリプトの実行状況が分かるので、そちらの方も確認してみてください。
プラグインはどのようにして導入するのですか?
とたけけさん
コメントありがとうございます。
プラグインは基本的にダウンロードした.jarファイルを「plugins」フォルダに格納しspigotを再起動することで有効化することが出来ます。
ただ、spigotに対応したバージョンのプラグインを導入する必要があるので、その辺は注意してください。(プラグインの配布サイトにそのあたりの情報は表示されていると思います)
その後、プラグインによっては「plugin」フォルダ内に作成されたプラグインのフォルダ内の設定ファイルを編集する必要があります。
あけましておめでとうございます。
実行後にlogsを確認しましたが、ログには直前にサーバーを終了した情報までしか載っておらず、起動のログは残っていませんでした。
http://or2.mobi/index.php?mode=image&file=189694.jpg
-xを指定した際表示されるログがこちらです。黄色い部分はユーザー名や管理者名なので隠しています。
http://or2.mobi/index.php?mode=image&file=189696.jpg
spigotフォルダに含まれるデータがこちらです。
何が原因でしょうか?
sasaさん
お返事が大変遅くなってしまい申し訳ありません。
こちらのブログの設定の関係で、せっかくいただいたコメントが反映されていませんでした。
本当にすみません。
「-x」での起動ログ上で気になるのは、「Xmx」と「Xms」の値が逆ではないでしょうか?
(前回頂いたコメントの段階で気づけずにすみません)
「Xmx」が使用するメモリの最大値で、「Xms」が初期メモリ使用値となるため、「Xmx」の値は「Xms」の値より大きいか同等である必要があります。
ですので、起動スクリプト上で「XMX」と「XMS」の値を同じにするか、「XMX=3072M」と「XMS=1024M」といったように値を逆に設定して再度試してみてください。
以上、よろしくお願いいたします。
起動スクリプトの作成がうまく行きません
どうすればいいのでしょうか?
http://or2.mobi/index.php?mode=image&file=200001.png
yuyumo6さん
コメントありがとうございます。
スクリプトの方を実際に見ていないのですが、張り付けてもらった画像からは下記の部分で原因でエラーが出ているように見えます。
ME=`whoami`
if [ $ME == $USERNAME ] ; then
実行時のログを見てみますと、変数の設定部分で「USERNAME」と記述する箇所が「ERNAME」となっているように見えますので、そこの部分を確認してみてください。
以上、よろしくお願いします。
このサイトとはあまり関係ないのですが、サーバーは立てれたのですがそのサーバーにワールドデータを入れるやり方がわからないのですが、どうすればいいのでしょうか?
さくらVPSです。おねがいします
あと一応サーバーには入れました。
VPSに自分のワールドを入れられればいいのですが…
お願いします!!
lol さん
コメントありがとうございます。
> このサイトとはあまり関係ないのですが、サーバーは立てれたのですがそのサーバーにワールドデータを入れるやり方がわからないのですが、どうすればいいのでしょうか?
別環境で遊んでいたワールドデータを持ってきたいという事でしょうか?
であれば、minecraftがインストールされているディレクトリにある、
「world」ディレクトリがワールドデータとなるので、それを入れ替えたいワールドデータと置き換えれれば良いですよ。
Windowsからのワールドデータのアップロード方法は、
このあたりの書き込みを参考にしてみてください。
https://minecraft.server-memo.net/conoha_mc_install/#comment-5034
他にご不明な点がありましたら、ご質問お願いします。
win10なのでソフト使ってアップロードしようとしたんですけど、なぜか接続できなくて…
ちゃんとIPもPASSWARDもあってるのに出来ないんです。
どうか対処法を教えてください!><
ちなみにソフトは WinSCPとFFFTPを使いました。
アップロードはscpかsftpになると思いますが、接続ポート番号はあっていますか?
また、SSH接続に鍵認証方式を採用しているのであれば、秘密鍵の登録は行っていますか?
WinSCPを使用してSFTPをする際の手順は、こちらのサイトが参考になると思いますので、確認してみてください。
https://support.conoha.jp/v/sftpwinscp/
sftpで接続する際は、rootユーザでは接続できないと思いますので、minecraftをインストールしたユーザで接続してください。
できるようになりました!
ありがとうございます!
よかったです!
聞き忘れたことがあったんですが、自分のPCと同期できる機能ってありますか?
あとスクリプトの$は消して、USERNAMEとか入れればいいんですよね?
> あとスクリプトの$は消して、USERNAMEとか入れればいいんですよね?
これはどの部分を指しているのでしょうか?
minecraftやspigotにはそういった機能はありませんので、手動でワールドデータのコピーが一般的な方法となります。
ちなみに、ワールドデータをコピーする際には、コピー元およびコピー先のマイクラを停止させておく必要があります。
こんにちは。
前のワールドを入れると大量のログが出てきて、サーバーには入れてもワールドが読み込まれてないんですよ。
どうすれば解決できますか?
worldファイルに別のワールドのファイルを入れると落ちてしまいます。
YYYYさん
コメントありがとうございます。
> 前のワールドを入れると大量のログが出てきて、サーバーには入れてもワールドが読み込まれてないんですよ。
> どうすれば解決できますか?
表示されるログにエラーの内容が表示されていると思いますが、なんと表示されていますか?
他に下記の項目についても確認してみてください
・ワールドデータのコピー元とコピー先のマイクラのバージョンはあっているか
・java版のワールドデータであるか
・ワールドデータの所有者がマイクラ実行ユーザと同じかどうか
[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]
こんなようなログがいっぱい流れます
ワールド内を動いたりすると
なんかワールドデータのlevel.datファイルなどが文字化けしてました。
これって元からなのでしょうか?
ログを見る限り、ワールドデータが破損しているようにみえますね。
もう一度ワールドデータをコピーしなおしてみても現象はかわりませんか?
> なんかワールドデータのlevel.datファイルなどが文字化けしてました。
> これって元からなのでしょうか?
level.datはテキストファイルではないので、catとかで中身をみても文字化けしてしまいます。
実は、実験用で自分のPCでサーバー立ててやってみたんですけど、
しっかりできるんですよ
あと、java版のワールドってどうゆう意味ですか?
spigotサーバーで建てたやつを、VPSのほうに送っちゃダメなんですか?
spigotからspigotであれば問題ありません。
VPS内で作られたworldしかちゃんと動いてくれないんですよね
でも、自分のPCで建てたらできるっていう、、、
1.12.2 OFのファイルから spigot
そのspigotからvps spigot
でも行けますよね?
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も停止してから行っていますよね?
level.dat: No such file or directory
とでてきました。
あとサーバーを停止中って、spigotですよね?
VPS自体は止めなくてもいいんですよね?
—- 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)
[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]
基本的に、パーミッションはどうすればいいんですか?
すべてrootから変えたんですけどそれでもだめなんですか?
> level.dat: No such file or directory
> とでてきました。
level.datがあるディレクトリでコマンド実行しましたか?
> あとサーバーを停止中って、spigotですよね?
> VPS自体は止めなくてもいいんですよね?
はいspigotを停止してあれば問題ありません。
> 基本的に、パーミッションはどうすればいいんですか?
> すべてrootから変えたんですけどそれでもだめなんですか?
rootからどのユーザに変えました?
spigotをインストールおよび動作させているユーザと同じにしてあれば問題ないと思いますが。
たとえばこのページの手順通りspigotのインストール行った場合、「spiadmin」というユーザを作成してインストールしているので、「world」ディレクトとその中のデータは、ユーザとグループともに「spiadmin」に設定しておく必要があります。
permissionは与えずに、ユーザーだけ変えればいいですかね?
すべてのspigotに入ってるファイルを
名前の変更で行けました。
何度も質問に答えていただきありがとうござました!
解決したようで良かったです!
でもスクリプト終わってなかった、、
こんばんは。
自動起動設定ファイル作成が出来ません。
ファイルを編集し、:wq!で保存した所
“/etc/systemd/system/spigot.service” E212:Can’t open file for writing
Press ENTER or type command to continue
というメッセージが表示され保存出来ません。
解決方法などがあればご教示願います。
加藤さん
コメントありがとうございます。
> E212:Can’t open file for writing Press ENTER or type command to continue
このエラーはviで書き込み権限がないのに、保存しようとした場合に表示されるメッセージです。
「/etc/systemd/system/」ディレクトリは、rootユーザのみしか書き込み権限がないので、
自動起動設定用のファイルを作成するときは、rootユーザで作業を行う必要があります。
もし、一般ユーザで作業している場合はrootユーザでファイルの作成を行ってみてください。
ご返信ありがとうございます。
解決しました、ありがとうございました。
すいません、起動パッチを設定して、コンソールで起動コマンド打ってみたんですけど、Starting spigot-1.12.2.jar…しかでなくて、サーバーが読み込まれてるログが出てこないんですけどどうせれば解決できますか?
すめしさん
コメントありがとうございます。
これは起動用のスクリプトを実行してもspigotのサーバが起動しないという認識で良いでしょうか?
screenの仮想端末には接続(Attach)できますか?
出来ているのであれば、そこに何かログが表示されていないか確認お願いします。
screenの仮想端末には接続(Attach)出来ない場合は、起動スクリプトを実行する際に「-x」オプションを指定してから実行すると、上手く動作しない原因がわかるかもしれません。
サイトで解説している手順で
$ ./spi_start.sh
と実行している部分を下記のようにしてみてください。
$ sh -x ./spi_start.sh
これで、シェルスクリプトの実行状況が詳しく表示されるようになるため、そこから問題がある部分が分かるかもしれません。
ごめんなさい自分で解決できました
アタッチしないといけなかったのに…
シェルスクリプトで自動再起動ってできませんか?
while true
do
screen java -jar -Xms3072M -Xmx3072M -jar spigot-1.16.4.jar
sleep 5
done
これを試してみて自動再起動はできたのですが、screenじゃなくていろいろ使いづらいんです。どうすればscreenで起動できますか?
ごめんなさい><
勝手ながら質問変えさせていただきます。
自動再起動のユニットがうまく働いてくれません。
loaded: loadedになってはいますが systemctl enable spigot.service をやって
systemctl status spigot.service で確認すると Active: failed (Result: start-limit)
と出てきて失敗してるんです。
あと /stop と打って一回サーバー止まってすぐにまた動き出すスクリプトもお願いしたいです><
本当に厚かましくて申し訳ありません。
LL さん
コメントありがとうございます。
スクリプトではないのですが、sysytemdでspigotの自動起動を行っているのであれば、spi君さんからの質問に返答した方法で自動で起動するように設定を行うことが出来ますが、いかかでしょうか?
LLさん
この内容だけではエラーの原因が絞り切れませんので、spigot.serviceの内容とsystemctl status で表示されているログを教えていただくことはできますか?
こんにちは!
spigotサーバーがクラッシュなどで落ちてしまった場合どうやって自動起動させればいいですか?
ご教授いただければ幸いです。
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」コマンドで設定反映
以上、よろしくお願いします。
やってみます
追加して反映させてから、/stopしてみたんですが、再起動してくれませんでした。
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.
クラッシュ時(Spigot)の自動再起動はshファイルの内容を変えてできるようになりました。
ですがやっぱりサーバー起動時(CentOS7のサーバー起動時)に自動でshを起動できるようにはできませんでした。
サーバー起動してすぐに screen -ls を使用してみたら 859.spigot (Dead ???)
となっていました。
ちなみに内容は
[Unit]
After=network-online.target
[Service]
User=lol
ExecStart=/opt/spigot/Runserver.sh
[Install]
WantedBy=multi-user.target
です。
ごめんなさい。すべて自己解決できました。
お忙しい中返信ありがとうございました。
あーでもCentos7が起動したらspigotも動くようにはなりましたが、そこでrestartしてもまた起動してくれません。
#!/bin/bash
cd /opt/spigot
screen -AmdS spigot java -Xmx3072M -Xms3072M -jar spigot-1.16.4.jar nogui
これをshに記述してます。
sysytemdへの登録用ファイルについてですが、停止の処理が記述されていないようですが、なにか意図があってのことなのでしょうか?
この設定だと、サーバの停止や再起動の際に手動でspigotを停止させる必要があるので、手間がかかってしまうような気がします。
> そこでrestartしてもまた起動してくれません。
restartとは何を指していますか?
サーバの再起動ですか、それともsystemctlでのrestartでしょうか?
systemctlでrestartできないのはsystemdへの登録用ファイルにstopの処理が無いのが原因かもしれません。
ごめんなさい。このserviceファイルにrestart記述したら普通に動作しました…
何度も質問してしまい申し訳ありませんでした。
あとcrontabからサーバーに定期的にコマンドを送ることは可能なのでしょうか?
サーバというのはspigotサーバということでよいですか?
screen上で動作しているのであれば、このページに記載されているspigotの停止スクリプト内にある「screen -p 0 -S $SCNAME -X eval ‘stuff “stop”\015’」コマンドを応用すれば可能だと思いますよ。
下記の部分を適宜変更してみてください。
$SCNAME 部分をscreen名に変更
stop 部分を実行したいコマンド
あとやっぱり自動再起動(spigot)できてませんでした。
systemdのファイルをこのWEBのやつに変えてやっても
Loaded: loaded
Active: failed (Result: start-limit)
と出てきました。
> systemdのファイルをこのWEBのやつに変えてやっても
ということはスタートと停止用のスクリプトそれぞれ作成して、systemdの設定ファイルを作成しているという認識で良いでしょうか?
であれば、まずスタートと停止のスクリプト単体で動作テストした結果はどうでしたか?
もしその段階で動作しないのであればシェル実行時にsh -x ./spi_start.sh というように「-x」オプションを指定して実行すると実行途中の状況も表示されるようになりますので、どこでエラーが発生しているのかを判断しやすくなります。
スクリプト単体での動作に問題がないのであれば、systemdのログになにかエラーなどの情報は表示されていないか確認してみて下さい。
start,stopどちらとも正常に起動します。
systemdのログの確認はどうすればいいですか?
下記のコマンドでログを表示させることができます。
# journalctl -u spigot.service
あとは、/var/log/messages にもログは表示されていると思いますので、こちらもあわせて確認してみて下さい。
— No entries — と書いてあります
systemdへの登録要ファイルの名前は「spigot.service」となっていますか?
もし違う名前で登録してあるのであれば、その名前で実行してみて下さい。
あと、「systemctl start spigot」や「systemctl stop spigot」などは問題なく実行できるかもためしてみて下さい。
spigotの部分はsystemdに登録した際の名前に適宜読み替えて下さい。
Job for spigot.service failed because the control process exited with error code. See “systemctl status spigot.service” and “Journalctl -xe” for details. とでてきました
spigotのサービスを実行する際にエラーが出ていますね。
下記コマンドでエラーの原因となりそうなログは表示されませんか?
# systemctl status spigot.service
あと、/var/log/messages も確認してみて下さい。
下記コマンドでsystemdへの登録ファイルの内容が表示されるので、そちらの内容も教えていただけますか。
# systemctl cat spigot.service
[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
です
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.
この部分でエラーが発生しているみたいです。
ExecStart=/opt/spigot/spi_start.sh
/var/log/messegesの2021-04-03 21:42:23あたりのログにもう少し詳しい情報はありませんでしたか?
また、spigotが停止されている状態で、lolユーザにて「/opt/spigot/spi_start.sh」を実行して問題なく動作するか試してみて下さい。
21:42:23 のログがないです
あとlolユーザーで起動はできます
もう一度やってみたところ
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.
・エラーログについて
表示されているエラーログについていくつか質問させて下さい。
> 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ユーザでこちらを実行した際の結果についても教えていただけますか?
active active (running) になりました
しっかり起動しました。ご教授ありがとうございました。あともしよかったらcrontabでminecraftに定期的にコマンドを送る方法を教えてほしいです。
無事起動したようで何よりです。
> あともしよかったら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
screen -p 0 -S spigot -X eval ‘stuff “say test”\015’
とやってみたのですが反応ありません
ごめんなさい。できました。
色々教えてくださり本当にありがとうございました。
あーでもsh(stop.sh)で日本語にしてやると文字化けします
何度も質問すみません。
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)
とどんどん増えてしまいます。
この内容だとscreen上でspigotを起動したあとに5秒sleepさせて、停止処理を行わずにまた同様に起動を繰り替えすという動作になると思います。
ですので、spigotの停止処理を行わずに起動を行っているのが原因ではないでしょうか?
このスクリプトはどのような動作を想定しているのですか?
ごめんなさい。やはりsystemdのほうを教わりたいです。厚かましくて申し訳ありません。
返信大変なので新しく作ります。
[Server] 残り1秒でサーバーが停止します
が
[Server] 罧??1腱???泣???????罩≪??障?
というように文字化けしてしまいます。
メッセージの文字化けについていくつか確認してみてください。
・Minecraftのゲーム内で表示されているメッセージも文字化けしていますか?
・ロケール設定も確認してみてください。
ja_JP.UTF-8以外に設定されている場合はscreen上で文字化けしてしまうかもしれません。
確認方法は下記のページを参考にしてみて下さい。
https://www.server-memo.net/centos-settings/system/user-locale.html
関係ないのですがsu – root をやろうとすると
su: failed to execute /bin/bash: リソースが一時的に利用できません
とでてきます
ごめんなさい。suのことに関しては解決しました
できました!ありがとうございます
でもやっぱりcrontabで反応してくれません
/etc/crontabで設定を行っているのであれば、「/var/log/cron」に何かログは出力されていませんか?
忙しくて作業と返信ができていませんでした。
ログに関しては
crond[628]: (*system*) RELOAD (/etc/crontab)
があります
ログの状況からすると何も実行されていないように見えますが、どのように「/etc/crontab」の設定をされていますか?
0 0 * * * lol screen -p 0 -S spigot -X eval ‘stuff “say test”\015’
こんな感じです
設定をみたところ、0時0分にlolユーザでコマンドを実行する設定だと思いますが、その時間のログになにもなかったのでしょうか?
何もありません
では、問題の切り分けとして「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’」コマンドを直接入力した際には問題なく動作しているのですよね?
バイトで忙しくて返信できていませんでした。ごめんなさい。
logger test を実行したところmessageにtestと表示されました
あとコマンドですが、上のやつだと反応しなくて、「screen -p 0 -S spigot -X eval ‘stuff “say test”\015’」だと手打ちで反応したんです。
> バイトで忙しくて返信できていませんでした。ごめんなさい。
バイトおつかれさまです!
全然気にしないで下さい。
> logger test を実行したところmessageにtestと表示されました
ということは、crontabのスケジュール設定は問題がないようですね。
> あとコマンドですが、上のやつだと反応しなくて、「screen -p 0 -S spigot -X eval ‘stuff “say test”\015’」だと手打ちで反応したんです。
wordpressのコメント欄はなんか勝手にクォーテーション等が勝手にへんな風に変換されるみたいなので、crontabに設定する際はコメント欄からコピーせずに、コンソールで実際に動作したものをコンソール上からコピーするか、手動で実行させたいコマンドを設定して試してみてください。
訂正:上のものをコピーしたものだと何も起こらなかったです
手打ちで実行できたやつをcrontabに設定してもserver側には何も来ませんでした
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による自動変更は行われていないと思います。
やってみます