新聞中心
警告

站在用戶的角度思考問題,與客戶深入溝通,找到策勒網(wǎng)站設(shè)計(jì)與策勒網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名申請、虛擬主機(jī)、企業(yè)郵箱。業(yè)務(wù)覆蓋策勒地區(qū)。
因?yàn)檫@是Wiki的一個(gè)條目,可以在任何時(shí)間內(nèi)被任何人編輯,因此建議你不要完全使用這個(gè)腳本,而是將其當(dāng)作編寫腳本的指導(dǎo)手冊看待。
此特性為Java版獨(dú)有。
這是一個(gè)GNU/Linux發(fā)行版的Minecraft服務(wù)端的啟動(dòng)和維護(hù)腳本示例。
目錄
- 1 Systemd腳本
- 1.1 安裝
- 1.2 配置實(shí)例
- 1.3 啟動(dòng)/停止實(shí)例
- 1.4 自啟動(dòng)
- 1.4.1 啟用
- 1.4.2 禁用
- 2 Init.d腳本
- 2.1 先決條件
- 2.2 下載
- 2.3 軟件需求
- 2.4 安裝
- 2.5 卸載
- 2.6 用法
- 2.7 參考
- 2.8 附加信息
- 3 備選啟動(dòng)腳本
Systemd腳本[ ]
此方法適用于支持Systemd的所有現(xiàn)代服務(wù)器。Systemd是一種“萬金油”,用于各種需求。Ubuntu在15.04版引入了它。(此版本已停止支持,建議使用更高的LTS版本,但是以下內(nèi)容能正常在此版本中的Systemd上工作。)
安裝[ ]
- 連接到你的(v)root服務(wù)器,或者如果要在你的機(jī)器上運(yùn)行服務(wù)器,打開一個(gè)終端。
- 使用su或sudo命令切換為root用戶。要檢查當(dāng)前是否為root,運(yùn)行
id -u如果返回0,則是root。 - 接下來安裝一些必需的包:
apt install openjdk-8-jre-headless curl screen nano bash grep - 如果不存在
/opt目錄,則創(chuàng)建它:mkdir /opt - 現(xiàn)在你需要為此服務(wù)創(chuàng)建一個(gè)用戶:
adduser --system --shell /bin/bash --home /opt/minecraft --group minecraft - 創(chuàng)建Systemd Unit文件:
nano /etc/systemd/system/[email protected],內(nèi)容如下:
# 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 minecraft@survival # systemctl start minecraft@survival # # To run multiple servers simply create a new dir structure and enable/start it # systemctl enable minecraft@creative # systemctl start minecraft@creative
配置實(shí)例[ ]
現(xiàn)在你可以上傳你的FTB整合包到名為/opt/minecraft/的子文件夾。例如將"FTB Beyond"整合包放進(jìn)/opt/minecraft/FTBBeyond(不帶空格)。 如果你想運(yùn)行原版實(shí)例,只需要在/opt/minecraft內(nèi)創(chuàng)建文件夾,上傳minecraft_server.jar并創(chuàng)建eula.txt文件(使用:)。
上傳minecraft服務(wù)端文件后,使用ls -la /opt/minecraft命令確?!癿inecraft”是其所有者和所屬組。若不是,則運(yùn)行chown minecraft:minecraft /opt/minecraft/FTBBeyond。你也許還需要完成安裝。對于當(dāng)前的FTB包你可以運(yùn)行:
cd /opt/minecraft/FTBBeyond echo "eula=true" > /opt/minecraft/FTBBeyond/eula.txt su -c "/opt/minecraft/FTBBeyond/FTBInstall.sh" -s "/bin/bash" minecraft
啟動(dòng)/停止實(shí)例[ ]
你可以使用systemctl start minecraft@FTBBeyond來啟動(dòng)服務(wù)器并用systemctl stop minecraft@FTBBeyond來關(guān)閉服務(wù)器?!癅”后的部分是一個(gè)實(shí)例名稱,如文件夾名。該腳本也會(huì)在重啟服務(wù)器時(shí)幫助自動(dòng)停止你的Minecraft服務(wù)器。
自啟動(dòng)[ ]
啟用[ ]
systemctl enable minecraft@FTBBeyond
禁用[ ]
systemctl disable minecraft@FTBBeyond
Init.d腳本[ ]
用于不內(nèi)置Systemd的舊版服務(wù)器系統(tǒng)。
先決條件[ ]
必須安裝Screen包。
在CentOS及基于Red Hat的發(fā)行版上:
yum install screen
在Ubuntu等基于Debian的系統(tǒng)上:
apt-get install screen python
下載[ ]
使用wget下載本腳本,運(yùn)行下列命令:(注意本腳本需要更改WORLD、MCPATH和BACKUPPATH變量。
重要說明: 如果你使用了wget的方法而每行第一個(gè)字符都是空格,本腳本不會(huì)運(yùn)行并且update-rc.d會(huì)輸出錯(cuò)誤。如果這要,你必須移除每行開頭的空格。小心不要?jiǎng)h除空格以外的任何東西!
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://piston-meta.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
軟件需求[ ]
- screen
- python (
apt-get install python)
安裝[ ]
使用你所好的編輯器在/etc/init.d/下創(chuàng)建叫做minecraft的文件并將上面的腳本粘貼進(jìn)該文件。
根據(jù)你的配置編輯USERNAME和MCPATH變量。如果你想使用外覆腳本,更改INVOCATION來啟動(dòng)而不是直接從服務(wù)端啟動(dòng)。
確保新創(chuàng)建的文件擁有必需的權(quán)限,你可以以此設(shè)置權(quán)限:
chmod a+x /etc/init.d/minecraft
然后運(yùn)行(在基于Debian的發(fā)行版)
update-rc.d minecraft defaults
若使用啟用了基于依賴的啟動(dòng)(dependency-based booting)的Debian 6.0啟動(dòng),則使用insserv命令。若一切正常,insserv將沒有輸出。若想確認(rèn),檢查$?中的錯(cuò)誤碼。
insserv minecraft
在CentOS和RHEL(Redhat企業(yè)版Linux)上,你將需要將進(jìn)程添加至chkconfig列表,由chkconfig在systemd下管理啟動(dòng)腳本。
chkconfig --add minecraft
要檢查該進(jìn)程是否正確完成,使用ntsysv命令來持續(xù)滾動(dòng)直至看到minecraft進(jìn)程(如果不重復(fù)chkconfig命令來添加所需的符號(hào)鏈接)。
注意: 你的系統(tǒng)很可能會(huì)警告你該腳本不滿足所有需求。然而腳本還是會(huì)運(yùn)行。
你也可以在你的crontab下配置條目來備份服務(wù)端。一個(gè)crontab例子是每半小時(shí)備份一次:
- 使用你希望完成工作的用戶帳戶,運(yùn)行:
crontab -e
并添加這個(gè):
0,30 * * * * /etc/init.d/minecraft backup
如果由于你不知道如何使用vi而導(dǎo)致上述嘗試失敗,嘗試:
VISUAL=/usr/bin/nano crontab -e
卸載[ ]
(在基于debian的GNU/Linux發(fā)行版中)
update-rc.d -f minecraft remove
(在CentOS/RHEL中)
chkconfig --del minecraft
用法[ ]
在大多數(shù)系統(tǒng)上可以通過以下命令調(diào)用腳本,其中“(command)”可以是“stop”、“start”、“restart”或任何所支持的其他選項(xiàng):
/etc/init.d/minecraft (command)
在大多數(shù)基于RedHat或Debian的發(fā)行版中,可以使用service命令,以此調(diào)用:
service minecraft (command)
要查看屏幕,使用:
screen -r
要退出屏幕,使用:
CTRL+a+d
參考[ ]
- http://www.debian-administration.org/articles/28
- https://wiki.debian.org/LSBInitScripts/DependencyBasedBoot
附加信息[ ]
如果仍要查看實(shí)時(shí)日志文件,請?jiān)诜?wù)器目錄中使用此命令:
tail -f logs/latest.log
備選啟動(dòng)腳本[ ]
以下的這些腳本提供的函數(shù)與上述腳本相同,但包含了更多有用的特性:
- mcwrapper
- [Multi World] Minecraft Server Control Script
- 運(yùn)行多個(gè)Minecraft世界。
- 啟動(dòng)、停止和重啟多個(gè)世界。
- 創(chuàng)建、刪除、禁用和啟用多個(gè)世界。
- 相比于Mojang服務(wù)端,額外支持CraftBukkit。
- 自動(dòng)通知用戶重要的服務(wù)器事件。
- 使用Minecraft Query protocol來保持當(dāng)前服務(wù)器狀態(tài)的追蹤。
- LSB和systemd兼容的init腳本允許與服務(wù)器的啟動(dòng)和關(guān)閉序列無縫集成。
- 使用Minecraft Overviewer地圖繪制軟件繪制世界。
- 備份世界并移除超過X天的備份。
- 更新服務(wù)端軟件并安裝addons。
- 從命令行向世界服務(wù)器發(fā)送命令。
- minecraftd
- 使用systemd或腳本直接啟動(dòng)、停止和重新啟動(dòng)服務(wù)器
- 從命令行向服務(wù)器發(fā)送命令
- 備份服務(wù)器(世界、插件、配置等)和清除舊服務(wù)器(可配置)
- 如果沒有玩家登錄則掛起服務(wù)器,并在嘗試立即啟動(dòng)它至最大效率
- 純粹用大約500行代碼的bash和濃縮特性編寫,以保持較小的足跡
- 靈活的配置:支持例如 spigot和craftbukkit,可調(diào)節(jié)線程和RAM使用等。
- 具有初始化和備份腳本的完整systemd支持
- 安全資源使用:以不同用戶身份運(yùn)行腳本,如果不需要?jiǎng)t刪除權(quán)限
- 與本文中描述的腳本非常相似:它也使用屏幕和tar,但提供更高級(jí)的功能
- 非凡的Arch Linux支持
- MC Sheller
- Minecraft Systemd Service 一個(gè)很好的系統(tǒng)服務(wù),具有:
- 使用rcon安全關(guān)機(jī)
- 通過使大部分系統(tǒng)只讀來保護(hù)系統(tǒng)
- 使用systemd日志記錄
- 可以與一個(gè)不錯(cuò)的commandcenter腳本結(jié)合使用
- 完全集成在systemd-toolchain中
- minecraft init
- 使用多世界等更多功能修改此腳本
- Minecraft Service
- Dagmar d'Surreal's Sysv init script
- Setsuna-Xero's OpenRC(Gentoo) compatible init script, with conf.d defaults
- Mineserv Perl Init Script
- 一個(gè)非常簡單的自啟動(dòng)/停止腳本,具有備份和清理功能,并能夠?qū)⒚顐鬟f到服務(wù)器控制臺(tái)。
教程(作下劃線標(biāo)記的教程為中文獨(dú)有教程) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
分享名稱:創(chuàng)新互聯(lián)MinecraftWiki教程:Systemd腳本[]
路徑分享:http://m.fisionsoft.com.cn/article/dhhggep.html


咨詢
建站咨詢
