你可以幫助我們來翻譯此條目,但請勿使用機器翻譯。
因為這是Wiki的一個條目,可以在任何時間內被任何人編輯,因此建議你不要完全使用這個腳本,而是將其當作編寫腳本的指導手冊看待。
這是一個使用了GNU/Linux發行版的Minecraft啟動和維護腳本示例。
Systemd腳本
此方法適用於所有支持Systemd的現代伺服器。Systemd是「萬金油」,用於各種需求。Ubuntu在15.04版引入了它。(儘管這個版本有些老舊,但在此版本中Systemd能正常工作。)
安裝
- 連接到你的(v)root伺服器,或者如果要在你的機器上執行伺服器,打開一個終端。
- 使用su或sudo變更為root使用者。如果要檢查是否為root,執行
id -u。如果它返回0,那麼你已經是root。 - 安裝必須的包:
apt install openjdk-8-jre-headless curl screen nano bash grep - 如果不存在
/opt目錄,則建立它:mkdir /opt - 現在你需要為此服務建立一個使用者:
adduser --system --shell /bin/bash --home /opt/minecraft --group minecraft - 建立Systemd Unit檔案:
nano /etc/systemd/system/minecraft@.service,內容如下:
# 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
設定實例
現在你可以上傳你的FTB Modpacks到名稱為/opt/minecraft/的子資料夾。舉個例子,你要把the modpack "FTB Beyond"放進"/opt/minecraft/FTBBeyond" (名稱去掉空格). 如果你想執行vanilla instances,只需要在內部建立資料夾/opt/minecraft並且上傳minecraft_server.jar並建立eula.txt檔案(using: echo "eula=true" > /opt/minecraft/vanilla/eula.txt)。
在你上傳minecraft server檔案之後,確認"minecraft" is the owner and owning group. To do so just run "ls -la /opt/minecraft". If it is not, run "chown minecraft:minecraft /opt/minecraft/FTBBeyond". 你可能也需要完成安裝。For current FTB packages you would run:
cd /opt/minecraft/FTBBeyond echo "eula=true" > /opt/minecraft/FTBBeyond/eula.txt su -c "/opt/minecraft/FTBBeyond/FTBInstall.sh" -s "/bin/bash" minecraft
啟動/停止實例
你可以使用「systemctl start minecraft@FTBBeyond」來啟動伺服器器及用「systemctl stop minecraft@FTBBeyond」來關閉伺服器。The part behind the 「@」後的部分是一個示例名稱,例如Folder Name。 這一腳本也會在你重啟伺服器時幫助自動停止你的Minecraft伺服器。
自動啟動
啟用
systemctl enable minecraft@FTBBeyond
停用
systemctl disable minecraft@FTBBeyond
Init.d腳本
For legacy Servers, not supporting Systemd
先決條件
Screen package must be installed.
On CentOs and Red Hat-based distributions:
yum install screen
On Debian based systems such as Ubuntu:
apt-get install screen python
Download
To download the script with wget, run the following (WATCH OUT SCRIPT NEEDS WORK - change the WORLD, MCPATH and BACKUPPATH variables.
Important: If you use the wget method and the first character of every line is an empty space, the script won't work and update-rc.d outputs errors. If so, you have to remove the leading empty spaces from each line. Be careful not to delete anything else than empty space though!)
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
軟體需求
- screen
- python (apt-get install python)
安裝
Use your favorite editor to create file called minecraft in /etc/init.d/ and paste the script above in that file.
Edit the USERNAME and MCPATH -variables according to your setup. If you use a wrapper script, change INVOCATION to start it instead of starting the server directly.
Make sure the newly created file has required permissions You can set the permissions by running:
chmod a+x /etc/init.d/minecraft
Then run (on Debian-based distributions)
update-rc.d minecraft defaults
Starting with Debian 6.0, the insserv command is used instead, if dependency-based booting is enabled. insserv will produce no output if everything went OK. Examine the error code in $? if you want to be sure.
insserv minecraft
On CentOs and RHEL(Redhat enterprise Linux) You will need to add the process into the chkconfig list chkconfig manages startup scripts under systemd
chkconfig --add minecraft
To check if the process is done correctly use the ntsysv command keep scrolling until you see the minecraft process if you don't repeat the chkconfig command. to add required symbolic links. Note: your system will most likely warn you that the script does not meet all requirements. The script will however work.
You can also setup an entry in your crontab to backup the server. A sample crontab to backup every half hour on the hour, and 30 minutes into the hour:
- Using the user account you want the work done under, run:
crontab -e
and add this
0,30 * * * * /etc/init.d/minecraft backup
If the above attempt went poorly because you do not know how to use vi, try:
VISUAL=/usr/bin/nano crontab -e
卸載
(In debian based GNU/Linux distribution)
update-rc.d -f minecraft remove
(In CentOs/RHEL)
chkconfig --del minecraft
用法
The script may be invoked via the following command on most systems, where "(command)" will be "stop", "start", "restart", or any of the other options it supports.
/etc/init.d/minecraft (command)
On most RedHat- or Debian-based distribution where the `service` command is available, it should be invoked as:
service minecraft (command)
To view the screen, use:
screen -r
To exit the screen, use:
CTRL+a+d
參考
- http://www.debian-administration.org/articles/28
- https://wiki.debian.org/LSBInitScripts/DependencyBasedBoot
附加資訊
If you still want to view the live log file, use this command in the server directory.
tail -f logs/latest.log
另一種啟動腳本
The following scripts offer the same functions as the above script but contain more useful features:
- [Multi World] Minecraft Server Control Script
- Run multiple Minecraft worlds.
- Start, stop, and restart single or multiple worlds.
- Create, delete, disable, and enable worlds.
- Supports CraftBukkit in addition to the standard Mojang server distribution.
- Users automatically notified of important server events.
- Uses the Minecraft Query protocol to keep track of current server conditions.
- LSB and systemd compatible init script, allows for seamless integration with your server's startup and shutdown sequences.
- Map worlds using the Minecraft Overviewer mapping software.
- Backup worlds, and remove backups older than X days.
- Update the server software and installed addons.
- Send commands to a world server from the command line.
- minecraftd
- Start, stop, and restart the server using either systemd or the script directly
- Send commands to a server from the command line
- Backup server (world, plugins, configuration, etc.), and purge old ones (configurable)
- Suspend server if no player is logged in and bring it up as soon as one tries to join to maximazie efficiency
- Purely written in bash and condensed features in about 500 lines of code to keep the foorprint small
- Flexible configuration: support for e.g. spigot/craftbukkit, adjustable threads and RAM usage, etc.
- Full systemd support with init and backup script
- Secure resource usage: run script as different user and drop permissions if not requiered
- Very similiar to the script described in this article: It as well uses screen and tar but offers more advanced features
- Excellent Arch Linux support
- Minecraft Systemd Service A nice systemd service that features:
- safe shutdown using rcon
- protection of the system by making most of the system readonly
- uses systemd journal to log
- can be combined with a nice commandcenter script
- is fully integrated in the systemd-toolchain
- minecraft init
- modification of this script with a lot more features like multiworld
- Mineserv Perl Init Script
- A very simple automatic start/stop script with backup and cleanup functions and the ability to pass commands to the server console.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||