[Linux] 利用 screen 架設 Minecraft 伺服器

其實我蠻好奇的,
如果有人真的想用 Linux 架設伺服器,
Linux 功力應該都不錯吧?
會來看這篇文章嗎?
還是自己就能解決了...
(白寫這篇?

如果你是第一次碰 Linux 就想架設伺服器,
我建議你還是不要。

使用 screen 是因為在 Linux 上架設 Minecraft 和在 Windows 上有很大的不同,
在 Windows 這種視窗化的介面,
甚至只要在 server.jar 上面點兩下就完成了。
(雖然 Linux 也是有圖形化介面的)

這次都是在終端下完成,
但用過遠端 ssh 的都知道,
只要斷開連線,
正在執行的程式就會被終止。

面對不需要互動的程式用 nohup
就可以在遠端連線中斷後繼續執行,
但是像是 Minecraft 這種需要互動式
輸入指令來管理的程式,
nohup 就顯得不適用了。

使用 screen 不只可以在遠端斷線後讓程式繼續執行,
還可以和程式進行互動的輸入輸出,
配合 systemd 還可以設定開機運行,
關閉後自動重開。

screen

安裝

如果是用 Debian 、 Ubuntu 、 Mint 或是其他使用 apt 作為
Package Manager 的 distro ,

sudo apt-get install screen

安裝完之後試試 screen 能不能用

linux-screen

正常來說應該是要有這樣的畫面的

基本操作

進入 screen 之後,
screen 的所有控制都是 ctrl+a 開頭的,
其他的快捷鍵可以通過 ctrl+a 放開後按 ? 查看,
退出 screenctrl+a 放開後再按 d

linux-screen-shortcuts

可以用 screen -ls 指令來看目前有幾個 session
screen -r <剛剛ls看到的id> 來回到剛剛的 session

linux-screen-r

要關閉當前的 session 的話,
可以回到 session 後按下 ctrl+a 在按 \
這時候他會問你確定嗎,按 y 就好。

或是也可以用 quit 命令來關閉

screen -X -S [想關閉的session的ID] quit

如果不想每次都用 ID 來指定 session 的話,
也可以在創建時就指定名稱,

screen -S a-friendly-name

之後就可以用這個名稱來指定 session

screen -r a-friendly-name
screen -X -S a-friendly-name quit

剩下的功能就不一一敘述了,
足夠架設 Minecraft 伺服器即可。

如果有想了解更多的話可以看這個影片
How to use GNU screen - the terminal multiplexer - linux

Java

java -version

如果沒有裝的話
Debian, Ubuntu, Mint 等用 APT 的應該都可以用

sudo apt-get install default-jre

來安裝

試運行

先創建一個資料夾

mkdir mc-test

把要伺服器檔案複製進去,
我這邊是用 spigot-1.12.2.jar

cp spigot-1.12.2.jar mc-test

然後創建 eula.txt
(用自己習慣的編輯器就好)

cd mc-test
vim eula.txt

eula=true 寫進去

eula=true

試運行看看

java -jar spigot-1.12.2.jar

如果是官方的版本記得要加上 nogui

java -jar server.jar nogui

linux-mc-spigot-test

配合 screen 運行

如果剛才的 screen 沒有問題,
Java 運行也沒有問題,
那就試試先開一個 screen session ,

取一個好認的名字

screen -S minecraft-server

進入 screen 之後就可以運行 Minecraft 伺服器

java -Xms512G -Xmx1G -jar spigot-1.12.2.jar

之後就畫看到正常運行 Minecraft 伺服器的信息

如果這時候遠端連線斷線
伺服器也會繼續運行

systemd 自動運行

先創建 /var/lib/minecraft
/var/lib/minecraft/server -> 放 .jar 檔案
/var/lib/minecraft/env -> 放伺服器運行時所需檔案
/var/lib/minecraft/systemd -> 放 systemd 設定檔

sudo mkdir /var/lib/minecraft
sudo mkdir /var/lib/minecraft/server
sudo mkdir /var/lib/minecraft/env

spigot-1.12.2.jar 放進去
並創建一個 symbolic link current

sudo cp spigot-1.12.2.jar /var/lib/minecraft/server
sudo ln -s /var/lib/minecraft/server/spigot-1.12.2.jar \
/var/lib/minecraft/server/current

創建啟動腳本

sudo vim /var/lib/minecraft/systemd/start.sh
#!/bin/sh

SCREEN=/usr/bin/screen
JAVA=/usr/bin/java
SERVER=/var/lib/minecraft/server/current

SCREEN_SESSION_NAME=minecraft-server

JAVA_MEM_MIN=512M
JAVA_MEM_MAX=1G

$SCREEN -D -S $SCREEN_SESSION_NAME -m $JAVA -Xms$JAVA_MEM_MIN -Xmx$JAVA_MEM_MAX -jar $SERVER

創建停止腳本

sudo vim /var/lib/minecraft/systemd/stop.sh
#!/bin/sh

SCREEN=/usr/bin/screen

SCREEN_SESSION_NAME=minecraft-server

STOP_CMDS="'save-all' 'stop'"

for CMD in $STOP_CMDS
do
    $SCREEN -S $SCREEN_SESSION_NAME -X "stuff $CMD\\015"
done

sleep 5

創建運行時所需檔案的資料夾

想不到叫甚麼...
就先叫 001 好了

sudo mkdir /var/lib/minecraft/env/001
sudo ln -s /var/lib/minecraft/env/001 /var/lib/minecraft/env/current

eula.txt

sudo vim /var/lib/minecraft/env/current/eula.txt
eula=true

minecraft.service

sudo vim /var/lib/minecraft/systemd/minecraft.service
[Unit]
Description=Minecraft Server
After=network.target

[Service]
WorkingDirectory=/var/lib/minecraft/env/current

User=minecraft
Group=minecraft

Restart=always

ExecStart=/var/lib/minecraft/systemd/start.sh

ExecStop=/var/lib/minecraft/systemd/stop.sh

[Install]
Wanted=multi-user.target

創建 user minecraft

sudo useradd -r -d /var/lib/minecraft minecraft

將檔案擁有者轉給 minecraft

sudo chown -R minecraft:minecraft /var/lib/minecraft

建立連結到 /etc/systemd/system

sudo ln -s /var/lib/minecraft/systemd/minecraft.service /etc/systemd/system

reload

sudo systemctl daemon-reload

啟用

sudo systemctl enable minecraft

執行!

sudo systemctl start minecraft

這時只要是伺服器自己關閉,
他也會自動重開了。

如果想要停止的話用 stop 就好了

sudo systemctl stop minecraft

管理

要對伺服器後台管理的話,
先切換身分為 minecraft

sudo su minecraft -s /bin/bash
script /dev/null

在打開伺服器用的 session 就好了

screen -r minecraft-server
Show Comments