====== Скрипты Minecraft ======
===== Управление сервером Debian/Ubuntu =====
nano server.sh
#!/bin/bash
#------------------------------------------------------------------------------
# Управление сервером Minecraft
# Версия 1.3
# Автор: FLIP (ArtShefer)
#
# Разреши скрипту исполняться:
# chmod +x server.sh
#
# Вызвать справку:
# ./server.sh help
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# Конфигурация
#------------------------------------------------------------------------------
# Индивидуальное имя для проекта
name="mc"
# Минимальный объем оперативной памяти (G - Гбайт)
min="1G"
# Максимальный объем оперативной памяти (G - Гбайт)
max="2G"
# Имя ядра сервера
#core="server.jar"
core="server.jar"
# Полный путь к каталогу с сервером
#path="/home/user/servermc"
path="/home/user/servermc"
# Путь к java
#java="/usr/bin/java"
java="/usr/bin/java"
# Параметры java
#javaopt="-server -Dfile.encoding=UTF-8"
javaopt="-server -Dfile.encoding=UTF-8"
# Параметры ядра
#coreopt="--nogui"
coreopt="--nogui"
# Имя для screen (используется индивидуальное имя проекта)
#screen="mc"
screen=$name
# Полный путь к каталогу для бекапов
#bakpath="/home/user/backup"
bakpath="/home/user/backup"
# Префикс для бекапа (используется индивидуальное имя проекта)
#bakname="mc"
bakname=$name
# Удаление бекапов старее указанных дней
baktime=7
# Имя для службы (используется индивидуальное имя проекта)
# Для установки в /etc/systemd/system
# Так же для службы используется данный скрипт
# После переименовании скрипта, потребуется переустановка службы
#service="mc-daemon"
service="$name-daemon"
#------------------------------------------------------------------------------
# Ядро
#------------------------------------------------------------------------------
scriptHelp() {
echo ""
echo "Использование: $0 [Параметр] ..."
echo "Перед запуском сервера необходимо запустить проверки:"
echo " $0 test"
echo ""
echo "Параметры запуска:"
echo " help - показать эту справку"
echo " test - запустить проверки"
echo " start - запустить сервер"
echo " stop - остановить сервер"
echo " restart - перезагрузить сервер"
echo " status - статус сервера"
echo " backup - создать бекап сервера"
echo ""
echo " save - сохранить мир (save-all)"
echo " say сообщение - сказать от имени сервера (say)"
echo " me сообщение - сказать от имени сервера (me)"
echo " cmd команда - передать команду серверу"
echo ""
echo "Параметры запуска требующие пароль суперпользователя (ROOT):"
echo " install - установка службы (демона)"
echo " remove - удаление службы (демона)"
echo " reinstall - переустановка службы (демона)"
echo ""
echo "СЛУЖБА"
echo " Установка службы для сервера, позволит запускать сервер автоматически"
echo " при старте системы без добавления в cron, а так же позволит"
echo " безопасно завершить работу сервера при выключении/перезагрузки системы"
echo " Будет доступно управление через systemctl, служба $service"
echo ""
echo "БЕКАП"
echo " Сделать бекап можно только при выключенном сервере"
echo " Если во время запуска бекапа был запущен сервер, он его остановит"
echo " и запустит после завершения работы. При этом предупредит игроков о"
echo " перезагрузке сервера, за минуту до начала выполнения резервной копии"
echo ""
echo " майнкрафт для мальчиков, факторка для мужиков"
}
daemonpath="/etc/systemd/system/$service.service"
mineCMD() {
/usr/bin/screen -p 0 -S $screen -X stuff "$*\n"
}
checkServer() {
if [ $(/usr/bin/screen -ls | grep ".$screen"$'\t' | wc -l) -eq 1 ]; then
return 1
else
return 0
fi
}
checkScreen() {
if [ -f "/usr/bin/screen" ]; then
return 1
else
return 0
fi
}
checkJava() {
if [ -f $java ]; then
return 1
else
return 0
fi
}
checkCore() {
if [ -f $path/$core ]; then
return 1
else
return 0
fi
}
checkBackup() {
if [ -d $bakpath ]; then
return 1
else
return 0
fi
}
checkService() {
if [ -f $daemonpath ]; then
return 1
else
return 0
fi
}
checkEula() {
if [ -f $path/eula.txt ]; then
if [ $(cat $path/eula.txt | grep eula=true | wc -l) -eq 1 ]; then
return 0
else
return 1
fi
else
return 0
fi
}
scriptTest() {
checkScreen
if [ $? -eq 1 ]; then
echo "+ screen установлен"
else
echo "- Программа screen не установлена"
echo " Подсказка для установки:"
echo " # apt-get install screen"
fi
checkJava
if [ $? -eq 1 ]; then
echo "+ java установлена"
else
echo "- Программа java не установлена"
echo " Подсказка для установки:"
echo " # apt-get install default-jdk"
fi
checkCore
if [ $? -eq 1 ]; then
echo "+ Ядро сервера найдено"
else
echo "- Ядро сервера не найдено"
echo " Подсказка:"
echo " Настрой скрипт и/или проверь наличие ядра в каталоге"
fi
checkBackup
if [ $? -eq 1 ]; then
echo "+ Каталог для бекапов найден"
else
echo "- Не найден каталог для бекапов (не обязательно)"
echo " Подсказка:"
echo " Настрой скрипт и/или проверь наличие каталога"
fi
checkService
if [ $? -eq 1 ]; then
echo "+ Служба сервера найдена $service"
else
echo "- Служба сервера не найдена (не обязательно)"
echo " Подсказка для установки:"
echo " Запусти скрипт с параметром install"
fi
}
scriptMsgRestart() {
mineCMD "say Перезагрузка сервера через минуту!"
sleep 30
mineCMD "say Перезагрузка сервера через 30 секунд!"
sleep 20
mineCMD "say Перезагрузка сервера через 10 секунд!"
sleep 5
mineCMD "say Перезагрузка сервера через 5 секунд!"
sleep 1
mineCMD "say Перезагрузка сервера через 4 секунды!"
sleep 1
mineCMD "say Перезагрузка сервера через 3 секунды!"
sleep 1
mineCMD "say Перезагрузка сервера через 2 секунды!"
sleep 1
mineCMD "say Перезагрузка сервера через 1 секунду!"
sleep 1
}
scriptBackup() {
checkBackup
if [ $? -eq 1 ]; then
checkServer
if [ $? -eq 1 ]; then
serverRun=1
scriptMsgRestart
mineStop
sleep 1
else
serverRun=0
fi
find $bakpath -name "*.tar.gz" -type f -mtime $baktime -delete
backupname=$bakname"_backup_"$(date +'%Y-%m-%d-%H%M%S')".tar.gz"
tar cfvz $bakpath/$backupname $path/
if [ $serverRun -eq 1 ]; then
mineStart
fi
else
echo "Не найден каталог для бекапов"
echo "Запусти тест:"
echo "$0 test"
fi
}
scriptRoot() {
if [ $(groups $USER | grep sudo | wc -l) -eq 1 ]; then
sudo $0 $*
else
su root -c "$0 $*"
fi
}
mineStart() {
checkEula
if [ $? -eq 1 ]; then
echo "Необходимо принять лицензионное соглашение Eula"
echo "В фале eula.txt замени false на true"
fi
echo "cd" $path "&&" $java -Xms$min -Xmx$max $javaopt -jar $path/$core $coreopt
cd $path && /usr/bin/screen -dmS $screen $java -Xms$min -Xmx$max $javaopt -jar $path/$core $coreopt
}
mineStartDaemon() {
sleep 5
mineStart
}
mineSave() {
mineCMD "save-all"
}
mineStop() {
mineCMD "stop"
checkServer
while [ $? -eq 1 ]
do
checkServer
done
}
mineRestart() {
scriptMsgRestart
mineStop
sleep 1
mineStart
}
mineStatus() {
checkServer
if [ $? -eq 1 ]; then
echo "Сервер запущен"
else
echo "Сервер не запущен"
fi
}
mineSay() {
mineCMD $*
}
mineMe() {
mineCMD $*
}
runUser() {
if [ -n "$1" ]
then
case $1 in
help)
scriptHelp
;;
test)
scriptTest
;;
start)
mineStart
;;
start-daemon)
mineStartDaemon
;;
stop)
mineStop
;;
restart)
mineRestart
;;
status)
mineStatus
;;
install)
scriptRoot install $USER
;;
remove)
scriptRoot remove
;;
backup)
scriptBackup
;;
save)
mineSave
;;
say)
mineSay $*
;;
me)
mineMe $*
;;
cmd)
cmd=$*
mineCMD ${cmd:4}
;;
*)
echo "Ты ошибся приятель!"
scriptHelp
;;
esac
else
echo Запусти: $0 help
fi
}
daemonWrite() {
echo $* >> $daemonpath
}
daemonInstall() {
if [[ $2 == "" ]];then
echo "Запусти команду от пользователя"
else
checkService
if [ $? -eq 1 ]; then
echo "Служба сервера уже существует $service"
else
scriptserver=$( realpath $0 )
daemonWrite "[Unit]"
daemonWrite "Description=Minecraft Server $name"
daemonWrite "After=network.target"
daemonWrite ""
daemonWrite "[Service]"
daemonWrite "Type=oneshot"
daemonWrite "RemainAfterExit=yes"
daemonWrite "User=$2"
daemonWrite "Restart=no"
daemonWrite "ExecStart=$scriptserver start-daemon"
daemonWrite "ExecStop=$scriptserver stop"
daemonWrite ""
daemonWrite "[Install]"
daemonWrite "WantedBy=multi-user.target"
daemonWrite ""
systemctl daemon-reload
systemctl enable $service.service
echo "Служба $service установлена"
fi
fi
}
daemonRemove() {
checkService
if [ $? -eq 1 ]; then
systemctl disable $service.service
rm $daemonpath
systemctl daemon-reload
echo "Служба $service удалена"
else
echo "Служба $service не существует"
fi
}
runRoot() {
if [ -n "$1" ]
then
case $1 in
install)
daemonInstall $*
;;
remove)
daemonRemove
;;
reinstall)
daemonRemove
daemonInstall $*
;;
*)
echo "Ты ошибся приятель!"
scriptHelp
;;
esac
fi
}
if [[ $EUID -ne 0 ]]; then
runUser $*
else
runRoot $*
fi