Hướng dẫn chơi Minecraft: Script khởi động Server


Hướng dẫn chơi Minecraft: Script khởi động Server

Đây là một ví dụ vềscript khởi động và bảo trì server Minecraft cho các bản phân phối GNU / Linux.

Script Systemd

Đối với tất cả các Modern Sever hỗ trợ Systemd. Systemd là jack của tất cả các trao đổi. Đối với Ubuntu, nó đi kèm với 15.04 (vâng, nó đã có một số bản phát hành trước đó, nhưng trong phiên bản này, nó đã hoàn toàn hoạt động).

Cài đặt

  1. Kết nối với máy chủ gốc của bạn hoặc nếu bạn muốn chạy server trên máy , mở terminal.
  2. Chạy root sử dụng su hoặc sudo. Để kiểm tra root, chạy  id -unếu nó quay về  “0” thì bạn đã root đươc.
  3. Tải các packages cần thiết apt install openjdk-8-jre-headless curl screen nano bash grep
  4. Tạo thư mực/ opt nếu nó chưa tồn tại: mkdir /opt
  5. Bây giờ bạn cần tạo một user cho dịch vụ: adduser –system –shell /bin/bash –home /opt/minecraft –group minecraft
  6. Tạo tệp Systemd Unit nano /etc/systemd/system/[email protected] và như sau :
# Source: https://github.com/agowa338/MinecraftSystemdUnit/
# License: MIT
[Unit]
Description=Minecraft Server %i
After=network.target

[Service]
WorkingDirectory=/opt/minecraft/%i
PrivateUsers=true 
# Users Database is not available for within the unit, only root and minecraft is available, everybody else is nobody
User=minecraft
Group=minecraft
ProtectSystem=full 
# Read only mapping of /usr /boot and /etc
ProtectHome=true 
# /home, /root and /run/user seem to be empty from within the unit. It is recommended to enable this setting for all long-running services (in particular network-facing ones).
ProtectKernelTunables=true 
# /proc/sys, /sys, /proc/sysrq-trigger, /proc/latency_stats, /proc/acpi, /proc/timer_stats, /proc/fs and /proc/irq will be read-only within the unit. It is recommended to turn this on for most services.
# Implies MountFlags=slave
ProtectKernelModules=true 
# Block module system calls, also /usr/lib/modules. It is recommended to turn this on for most services that do not need special file systems or extra kernel modules to work
# Implies NoNewPrivileges=yes
ProtectControlGroups=true 
# It is hence recommended to turn this on for most services.
# Implies MountAPIVFS=yes

ExecStart=/bin/sh -c '/usr/bin/screen -DmS mc-%i /usr/bin/java -server -Xms512M -Xmx2048M -XX:+UseG1GC -XX:+CMSIncrementalPacing -XX:+CMSClassUnloadingEnabled -XX:ParallelGCThreads=2 -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -jar $(ls -v | grep -i "FTBServer.*jar\|minecraft_server.*jar" | head -n 1) nogui'

ExecReload=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "reload"\\015'

ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "say SERVER SHUTTING DOWN. Saving map..."\\015'
ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "save-all"\\015'
ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "stop"\\015'
ExecStop=/bin/sleep 10

Restart=on-failure
RestartSec=60s

[Install]
WantedBy=multi-user.target

#########
# HowTo
#########
#
# Create a directory in /opt/minecraft/XX where XX is a name like 'survival'
# Add minecraft_server.jar into dir with other conf files for minecraft server
#
# Enable/Start systemd service
#    systemctl enable [email protected]
#    systemctl start [email protected]
#
# To run multiple servers simply create a new dir structure and enable/start it
#    systemctl enable [email protected]
# systemctl start [email protected]

Cài đặt instance

Bây giờ bạn có thể tải lên FTB Modpacks của mình thành thư mục con của /opt/minecraft/. Ví dụ bạn sẽ đặt modpack “FTB Beyond” trong “/opt/minecraft/FTBBeyond” ( không khoảng cách ). Nếu bạn muốn chạy các phiên bản Vanilla, chỉ cần tạo folder trong /opt/minecraft và tải lên minecraft_server.jar và tạo file eula.txt (sử dụng: echo “eula=true” > /opt/minecraft/vanilla/eula.txt).

Sau khi bạn tải các file lên server của minecraft, đảm bảo rằng, “Minecraft” là chủ sở hữu và  sỡ hửu nhóm . Để làm thế chỉ cần chạy “ls -la /opt/minecraft”.Nếu không, chạy “chown minecraft:minecraft /opt/minecraft/FTBBeyond”. Bạn cũng có thể yêu cầu hoàn thành việc cài đặt.Đối với các gói FTB hiện tại, bạn sẽ chạy:

cd /opt/minecraft/FTBBeyond
echo "eula=true" > /opt/minecraft/FTBBeyond/eula.txt
su -c "/opt/minecraft/FTBBeyond/FTBInstall.sh" -s "/bin/bash" minecraft

Khởi động/Dừng Instances

Bạn sử dụng server của mình bằng cách sử dụng “systemctl start [email protected] “ và dừng  nó bằng cách sử dụng “systemctl stop [email protected]”. Phần đằng sau “@” là tên instance của bạn ví dụ : Folder Name. Script này cũng hỗ trợ tắt tự động server minecraft của bạn server nếu bạn khởi động lại server

Tự động khởi động

Kích hoạt

systemctl enable [email protected]

Vô hiệu hoá

systemctl disable [email protected]

Script Init.d

Đối với máy chũ cũ, không hỗ trợ systemd

Điều kiện tiên quyết

Screen package phải được cài đặt
Trên các bản phân phối dựa trên CentO và Red Hat:

yum install screen

Trên các hệ thống dựa trên Debian như Ubuntu:

apt-get install screen python

Download

Để tải xuống script với wget, hãy chạy phần sau  (CẨN THẬN SCRIPT CẦN ĐƯƠC HOẠT ĐỘNG – thay đổi các biến WORLD, MCPATH và BACKUPPATH . Quan trọng : nếu bạn dùng phương thức wget và kí tự của mỗi dòng là một khoảng trống, script sẽ không hoạt động và lỗi xuất ra update-rc.d o.Nếu vậy, bạn cần phải xoá các khoảng trống hàng đầu mỗi dòng . Hãy cẩn thận để không xoá bất kì thứ gì khác ngoài các khoảng trống!)

wget -O minecraft "http://minecraft.gamepedia.com/Tutorials/Server_startup_script/Script?action=raw"

 #!/bin/bash
 # /etc/init.d/minecraft
 # version 0.4.2 2016-02-09 (YYYY-MM-DD)
 #
 ### BEGIN INIT INFO
 # Provides:   minecraft
 # Required-Start: $local_fs $remote_fs screen-cleanup
 # Required-Stop:  $local_fs $remote_fs
 # Should-Start:   $network
 # Should-Stop:    $network
 # Default-Start:  2 3 4 5
 # Default-Stop:   0 1 6
 # Short-Description:    Minecraft server
 # Description:    Starts the minecraft server
 ### END INIT INFO
 
 #Settings
 SERVICE='minecraft_server.jar'
 SCREENNAME='minecraft_server'
 OPTIONS='nogui'
 USERNAME='minecraft'
 WORLD='world'
 MCPATH='/home/minecraft'
 BACKUPPATH='/minecraft/minecraft.backup'
 MAXHEAP=2048
 MINHEAP=1024
 HISTORY=1024
 CPU_COUNT=1
 INVOCATION="java -Xmx${MAXHEAP}M -Xms${MINHEAP}M -XX:+UseConcMarkSweepGC \
 -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=$CPU_COUNT -XX:+AggressiveOpts \
 -jar $SERVICE $OPTIONS" 
 
 ME=`whoami`
 as_user() {
   if [ "$ME" = "$USERNAME" ] ; then
     bash -c "$1"
   else
     su - "$USERNAME" -c "$1"
   fi
 }
 
 mc_start() {
   if  pgrep -u $USERNAME -f $SERVICE > /dev/null ; then
     echo "$SERVICE is already running!"
   else
     echo "Starting $SERVICE..."
     cd $MCPATH
     as_user "cd $MCPATH && screen -h $HISTORY -dmS ${SCREENNAME} $INVOCATION"
     sleep 7
     if pgrep -u $USERNAME -f $SERVICE > /dev/null ; then
       echo "$SERVICE is now running."
     else
       echo "Error! Could not start $SERVICE!"
     fi
   fi
 }
 
 mc_saveoff() {
   if pgrep -u $USERNAME -f $SERVICE > /dev/null ; then
     echo "$SERVICE is running... suspending saves"
    as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"say SERVER BACKUP STARTING. Server going readonly...\"\015'"
     as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"save-off\"\015'"
     as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"save-all\"\015'"
     sync
     sleep 10
   else
     echo "$SERVICE is not running. Not suspending saves."
   fi
 }
 
 mc_saveon() {
   if pgrep -u $USERNAME -f $SERVICE > /dev/null ; then
     echo "$SERVICE is running... re-enabling saves"
     as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"save-on\"\015'"
     as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"say SERVER BACKUP ENDED. Server going read-write...\"\015'"
   else
     echo "$SERVICE is not running. Not resuming saves."
   fi
 }
 
 mc_stop() {
   if pgrep -u $USERNAME -f $SERVICE > /dev/null ; then
     echo "Stopping $SERVICE"
     as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"say SERVER SHUTTING DOWN IN 10 SECONDS. Saving map...\"\015'"
     as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"save-all\"\015'"
     sleep 10
     as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"stop\"\015'"
     sleep 7
   else
     echo "$SERVICE was not running."
   fi
   if pgrep -u $USERNAME -f $SERVICE > /dev/null ; then
     echo "Error! $SERVICE could not be stopped."
   else
     echo "$SERVICE is stopped."
   fi
 }
 
 mc_update() {
   if pgrep -u $USERNAME -f $SERVICE > /dev/null ; then
     echo "$SERVICE is running! Will not start update."
   else
     as_user "cd $MCPATH && wget -q -O $MCPATH/versions --no-check-certificate https://launchermeta.mojang.com/mc/game/version_manifest.json"
     if [ "$1" == "snapshot" ] ; then
       JSONVERSION=`cd $MCPATH && cat versions | python -c "exec(\"import json,sys\nobj=json.load(sys.stdin)\nversion=obj['latest']['snapshot']\nfor v in obj['versions']:\n   if v['id']==version:\n    print(v['url'])\")"`
     else
       JSONVERSION=`cd $MCPATH && cat versions | python -c "exec(\"import json,sys\nobj=json.load(sys.stdin)\nversion=obj['latest']['release']\nfor v in obj['versions']:\n   if v['id']==version:\n    print(v['url'])\")"`
     fi
     as_user "cd $MCPATH && wget -q -O $MCPATH/versions --no-check-certificate $JSONVERSION"
     MC_SERVER_URL=`cd $MCPATH && cat versions | python -c 'import json,sys;obj=json.load(sys.stdin);print(obj["downloads"]["server"]["url"])'`
     as_user "rm $MCPATH/versions"
     as_user "cd $MCPATH && wget -q -O $MCPATH/minecraft_server.jar.update --no-check-certificate $MC_SERVER_URL"
     if [ -f $MCPATH/minecraft_server.jar.update ] ; then
       if `diff $MCPATH/$SERVICE $MCPATH/minecraft_server.jar.update >/dev/null` ; then
         echo "You are already running the latest version of $SERVICE."
       else
         as_user "mv $MCPATH/minecraft_server.jar.update $MCPATH/$SERVICE"
         echo "Minecraft successfully updated."
       fi
     else
       echo "Minecraft update could not be downloaded."
     fi
   fi
 }
 
 mc_backup() {
    mc_saveoff
    
    NOW=`date "+%Y-%m-%d_%Hh%M"`
    BACKUP_FILE="$BACKUPPATH/${WORLD}_${NOW}.tar"
    echo "Backing up minecraft world..."
    #as_user "cd $MCPATH && cp -r $WORLD $BACKUPPATH/${WORLD}_`date "+%Y.%m.%d_%H.%M"`"
    as_user "tar -C \"$MCPATH\" -cf \"$BACKUP_FILE\" $WORLD"
 
    echo "Backing up $SERVICE"
    as_user "tar -C \"$MCPATH\" -rf \"$BACKUP_FILE\" $SERVICE"
    #as_user "cp \"$MCPATH/$SERVICE\" \"$BACKUPPATH/minecraft_server_${NOW}.jar\""
 
    mc_saveon
 
    echo "Compressing backup..."
    as_user "gzip -f \"$BACKUP_FILE\""
    echo "Done."
 }
 
 mc_command() {
   command="$1";
   if pgrep -u $USERNAME -f $SERVICE > /dev/null ; then
     pre_log_len=`wc -l "$MCPATH/logs/latest.log" | awk '{print $1}'`
     echo "$SERVICE is running... executing command"
     as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"$command\"\015'"
     sleep .1 # assumes that the command will run and print to the log file in less than .1 seconds
     # print output
     tail -n $((`wc -l "$MCPATH/logs/latest.log" | awk '{print $1}'`-$pre_log_len)) "$MCPATH/logs/latest.log"
   fi
 }

 mc_listen() {
   if pgrep -u $USERNAME -f $SERVICE > /dev/null ; then
     as_user "tail -f $MCPATH/logs/latest.log"
   else
     echo "$SERVICE is not running. Cannot listen to server."
   fi
}

 
 #Start-Stop here
 case "$1" in
   start)
     mc_start
     ;;
   stop)
     mc_stop
     ;;
   restart)
     mc_stop
     mc_start
     ;;
   update)
     mc_stop
     mc_backup
     mc_update $2
     mc_start
     ;;
   backup)
     mc_backup
     ;;
   status)
     if pgrep -u $USERNAME -f $SERVICE > /dev/null ; then
       echo "$SERVICE is running."
     else
       echo "$SERVICE is not running."
     fi
     ;;
   command)
     if [ $# -gt 1 ] ; then
       shift
       mc_command "$*"
     else
       echo "Must specify server command (try 'help'?)"
     fi
     ;;
   listen)
     mc_listen
     ;;
 
   *)
   echo "Usage: $0 {start|stop|update|backup|status|restart|command \"server command\"}"
   exit 1
   ;;
 esac
 
 exit 0

Các yêu cầu

  • Màn hình (screen)
  • python (apt-get tải python)

Cài đặt

Sử dụng trình editor yêu thích của bạn để tạo file có tên là minecraft trong /etc/init.d/ và dán script trên file đó .

Edit biến USERNAME và MCPATH theo setup của bạn. Nếu bạn sử dụng wrapper script, hãy thay đổi INVOCATION để khởi động nó thay vì trực tiếp khởi động server.

Đảm bảo rằng file vừa được tạo đã có các quyền cần thiết .Bạn có thể thiết lập các quyền bằng cách chạy thử :

chmod a+x /etc/init.d/minecraft

Sau đó chạy (trên các bản phân phối dựa trên Debian)

update-rc.d minecraft defaults

Bắt đầu với Debian 6.0, lệnh insserv được sử dụng để thay thế , Nếu dependency-based booting được kích hoạt. insserv sẽ không tạo ra output nếu mọi thứ đều ổn . Kiểm tra mã lỗi bằng $? Nếu bạn muốn chắc chắn

insserv minecraft

Trên CentOs và RHEL(Redhat enterprise Linux) Bạn sẽ cần thêm quy trình vào danh sách chkconfig , chkconfig quản lí scripts khởi động  trong hệ thống

chkconfig --add minecraft

Để kiểm tra xem quy trình đã được thực hiện đúng chưa hãy sử dụng lệnh tsysv tiếp tục cuộn cho đến khi bạn thấy quy trình minecraft nếu bạn không lặp lại lênh chkconfig . Để thêm các link tương trương cần thiết . Lưu ý : hệ thống của bạn rất có thể cảnh báo bạn rằng script không thể đáp ứng được tất cả các yêu cầu . Tuy nhiên script vẫn sẽ hoạt động

Bạn cũng có thể thiết lập một mục trong crontab của bạn để sao lưu server. Một crontab mẫu để sao lưu cứ mỗi 30 phút :

  • Sử dụng tài khoản của user mà bạn muốn công việc được thực hiện hãy chạy thử :
crontab -e
  • Và thêm
0,30 * * * * /etc/init.d/minecraft backup

Nếu bạn không thể thực hiện được vì bạn không biết cách dùng thì hãy thử :

VISUAL=/usr/bin/nano crontab -e

Cách gỡ

Trong các bản phân phối GNU/Linux dựa trên debain

update-rc.d -f  minecraft remove

Trong CentOs/RHEL

chkconfig --del minecraft

Cách dùng

Script có thể đươc gọi thông qua lệnh trên hầu hết các hệ thống, trong đó “(lệnh)” sẽ là “stop”, “start”, “restart”, hoặc bất kì tuỳ chọn nào khác mà nó hỗ trợ .

/etc/init.d/minecraft (command)

Hầu hết các bản phân phối dựa trên RedHat- hoặc Debian có lệnh `service`,nó sẽ được gọi là :

service minecraft (command)

Để xem màn hình, hãy dùng :

screen -r

Để thoát khỏi màn hình, hãy dùng :

CTRL+a+d

Những thông tin khác

Nếu bạn vẫn muốn xem file log trực tiếp, hãy sử dụng lệnh này trong thư mục server.nc

tail -f logs/latest.log

Scripts Khởi Động Thay Thế

Những script sau đây cung cấp các chức năng tương tụ như script trên nhưng chứa nhiều tính năng hữu ích hơn :

  • mcwrapper
  • [Multi World] Script điều kiển máy chủ (Minecraft Server Control Script)
    • Chạy vào nhiều mutiple world trong Minecraft.
    • Bắt đầu, dừng, và khởi động lại một hoặc nhiều thế giới .
    • Tạo, xoá, vô hiệu hoá,và kích hoạt nhiều thế giới.
    • Hỗ trợ CraftBukkit ngoài việc phân phối Mojang server tiêu chuẩn .
    • Người dùng đươc nhận thông báo tự động về các sự kiện quan trọng.
    • Sử dụng Minecraft Query protocolđể theo dõi các điều kiện của server hiện tại.
    • Script init tương thích LSB và systemd, cho phép tích hợp liền mạch với các chuỗi khởi động và tắt máy chủ của bạn
    • Bản đồ thế giới bằng phần mềm lập bản đồ Minecraft Overviewer .
    • Sao lưu thế giới và xoá các bản sao lưu cũ hơn X ngày .
    • Update phần mềm server và cài đặt addons.
    • Gửi lệnh tới server quốc tế từ dòng lệ.
  • minecraftd
    • Bắt đầu, dừng , và khởi động lại server bằng cách systemd hoặc script trực tiếp
    • pBackup server (thế giới , plugins, cấu hình vân vân.), và thanh lọc những cái cũ (có thể định cấu hình)
    • Tạm ngừng server nếu không có người chơi nào đăng nhập và đưa nó lên ngay khi có người cố gắng tham gia để đạt hiệu quả cao nhất .
    • Hoàn toàn viết trong bash và các tính năng cô động trong khoảng 500 dòng mã để giữ cho các bản in nhỏ .
    • Cấu hình linh hoạt : hỗ trợ cho ví dụ . spigot/craftbukkit, chủ đề điều chỉnh và sử dụng RAM, vân vân.
    • Hỗ trợ đầy đủ systemd với init và script hỗ trợ
    • Đảm bảo sử dụng tài nguyên : chạy script với tư cách là người dùng khác và bỏ quyền nếu không được yêu cầu.
    • Rất giống với script được tả trong bài viết này : nó cũng sử dụng màn hình và tar nhưng tính năng hoàn toàn được nâng cao hơn
    • Hộ trợ Arch Linux tuyệt vời
  • MC Sheller
  • Server của Minecraft Systemd Một server systemd tốt có tính năng :
    • Tắt máy an toàn bằng cách sử dụng rcon
    • Bảo vệ hệ thống bằng cách làm cho hầu hết hệ thống chỉ có thể đọc.
    • Sử dụng nhật kí systemd để đăng nhập
    • Có thể kết hợp với một commandcenter script tốt
    • Đươc tích hợp hoàn toàn trong systemd-toolchain
  • minecraft init
    • Sửa đổi tập lệnh này với nhiều chức năng hơn : như multible world
  • Server của Minecraft
  • Dagmar d’Surreal’s Sysv init script
  • Setsuna-Xero’s OpenRC(Gentoo) với init script tương thích , với mặc định conf.d
  • Mineserv Perl Init Script
    • Một script tự động khởi động/dừng đơn giản với các chức năng sao lưu, dọn dẹp và khả năng truyền lệnh đến bản điều khiển server

Xem bài viết gốc tại ĐÂY