你可以帮助我们来翻译此条目,但请勿使用机器翻译。
因为这是Wiki的一个条目,可以在任何时间内被任何人编辑,因此建议你不要完全使用这个脚本,而是将其当作编写脚本的指导手册看待。
这是一个可供参考的 Minecraft 启动脚本示例,并使用 GNU/Linux distros 对脚本进行维护。
先决条件
必须安装 Screen 包。
CentOs 和基于 Red Hat 系统的命令如下:
yum install screen
基于 Debian 系统(如 Ubuntu)的命令如下:
apt-get install screen
下载
要从网络上下载脚本,运行下列脚本。(注意脚本需要修改 - 更改 WORLD、MCPATH 和 BACKUPPATH 变量)
重要:如果你使用从网络行下载脚本的方法,每行的第一个字符必须是空格,否则脚本不会工作,并且 update-rc.d 会输出错误。如果出现了,你不得不移除每行所有的前导空格。(注意不要删除过多的空格!)
wget -O minecraft "http://minecraft.gamepedia.com/Tutorials/Server_startup_script/Script?action=raw"
#!/bin/bash
# /etc/init.d/minecraft
# version 0.4.1 2015-05-07 (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='/media/remote.share/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 http://s3.amazonaws.com/Minecraft.Download/versions/versions.json"
snap=`awk -v linenum=3 'NR == linenum {print; exit}' "$MCPATH/versions"`
snapVersion=`echo $snap | awk -F'\"' '{print $4}'`
re=`awk -v linenum=4 'NR == linenum {print; exit}' "$MCPATH/versions"`
reVersion=`echo $re | awk -F'\"' '{print $4}'`
as_user "rm $MCPATH/versions"
if [ "$1" == "snapshot" ]; then
MC_SERVER_URL=http://s3.amazonaws.com/Minecraft.Download/versions/$snapVersion/minecraft_server.$snapVersion.jar
else
MC_SERVER_URL=http://s3.amazonaws.com/Minecraft.Download/versions/$reVersion/minecraft_server.$reVersion.jar
fi
as_user "cd $MCPATH && wget -q -O $MCPATH/minecraft_server.jar.update $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
}
#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
;;
*)
echo "Usage: $0 {start|stop|update|backup|status|restart|command \"server command\"}"
exit 1
;;
esac
exit 0
Requirements
Installation
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
Uninstall
(In debian based GNU/Linux distribution)
update-rc.d -f minecraft remove
(In CentOs/RHEL)
chkconfig --del minecraft
Usage
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
References
- http://www.debian-administration.org/articles/28
- https://wiki.debian.org/LSBInitScripts/DependencyBasedBoot
Extra information
If you still want to view the live log file, use this command in the server directory.
tail -f logs/latest.log
Alternative Startup Scripts
The following scripts offer the same functions as the above script but contain more useful features:
- Minecraft Server Manager An improvement of this script with comprehensive features and multi-server support.
- Features include "super responsive" commands return as soon as possible, minimising player down time.
- Keeps players informed with configurable in-game messages, such as "Shutting down in 10 seconds!"
- Periodical WorldEdit compatible world backups.
- Load worlds into RAM for fast access reducing lag.
- Tab completion on all commands makes learning easy.
- Visit Minecraft Server Manager's GitHub page for the full list of features.
- mcwrapper
- [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.
- MC Sheller
- 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
- 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
- A very simple automatic start/stop script with backup and cleanup functions and the ability to pass commands to the server console.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||