mc服务器自重启/自备份脚本
设置开机自启动之后通过死循环保证运行
如何创建文件并设置自启动可以查看下面的链接
Ubuntu/Linux脚本创建方法
创建名为MC的screen,让mc后台运行
每次循环都检测screen是否存在,以及游戏进程java是否存在
如果上述两个不存在则尝试启动
如果存在之后则每次通过/list命令获取在线人数,使用count.log计算 “有几次检测到在线玩家为0”
当这个数量达到了MAX_COUNT,则备份、关闭游戏、重启服务器
重启之后该值会超过max,不再触发重启,直到有人进入将count.log的值更新为0
当服务器有人时,会因为count.lot值未更新而更新一次starttime,之后starttime保持不变,每当运行时间超过20000秒,则进行一次备份,不会导致游戏重启
我使用的是雨云服务器,如果有想开服务器的朋友们可以尝试下,超高单核频率,价格实惠,值得你的青睐
点击链接
https://www.rainyun.com/NTU2MDg3_
即可注册购买
还有优惠码"ais87"可以使用
#!/usr/bin/bash
PROCESS_NAME="java"
BACKUP_NAME="tar"
SCREEN_NAME="MC"
LOG_FILE="/root/NFWC/logs/latest.log"
FLAG_FILE="/root/auto_file.log"
COUNT_FILE="/root/count.log"
MAX_COUNT=5
GAME_PATH="/root/NFWC"
LOCK_FILE="/root/LOCK.log"
BACKUP_FILE="/data/backup"
MAX_BACKUP=2
BACKUP_TIME=20000
WaitGameSave()
{
sleep 2
local flag=$TRUE #表示未完成保存
while [ "$flag" == "$TRUE" ] ; do
NEW_CONTENT=$(tac "$LOG_FILE")
echo "$NEW_CONTENT" | while IFS= read -r line; do
echo "$line"
if [[ "$line" == *"$START_SAVING"* ]]; then
continue 2
echo "YES"
elif [[ "$line" == *"$END_SAVED"* ]]; then
flag=$FALSE
echo "win"
break 2
else
echo "NONE"
fi
done
echo "3"
sleep 1
done
echo "over"
}
back_up()
{
file_count=$(ls -1 $BACKUP_FILE | wc -l)
if [ $file_count -gt $MAX_BACKUP ]; then #删除过旧的备份
num=$(expr $file_count - $MAX_BACKUP)
ls -tr "$BACKUP_FILE" | head -$num | xargs -i -n1 rm "$BACKUP_FILE/{}"
fi
screen -S "$SCREEN_NAME" -X stuff "/say starting backup...\n"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] starting backup..."
screen -S "$SCREEN_NAME" -X stuff "/save-off\n"
screen -S "$SCREEN_NAME" -X stuff "/save-all\n"
sleep 5 #这里是等待游戏保存世界,如果太短了,也就是日志提示tar的过程中文件还在被更改,就调长点
tar -cPf /data/backup/$(date +%Y%m%d_%H%M%S).tar.gz /root/NFWC/world
while pgrep -x "$BACKUP_NAME" > /dev/null; do
sleep 1
done
screen -S "$SCREEN_NAME" -X stuff "/save-on\n"
screen -S "$SCREEN_NAME" -X stuff "/say Successful backup\n"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] successful backup"
}
start_time=$(date +%s) > /dev/null 2>&1
while true;do
#检测计数器
if [ ! -f "$COUNT_FILE" ];then
echo 0 >"$COUNT_FILE"
fi
count=$(cat "$COUNT_FILE")
#检查screen
screen -wipe > /dev/null 2>&1
if ! screen -list | grep -q "\.${SCREEN_NAME}" > /dev/null 2>&1 ; then
echo "There is not $SCREEN_NAME. Try to create..."
screen -dmS "$SCREEN_NAME" /bin/bash -l > /dev/null 2>&1
while ! screen -list | grep -q "\.${SCREEN_NAME}"; do
sleep 1
done
echo "screen $SCREEN_NAME run successfully"
screen -S "$SCREEN_NAME" -X stuff "cd $GAME_PATH\n"
sleep 1
fi
#检查游戏进程
while ! pgrep -x "$PROCESS_NAME" > /dev/null ;do
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Try to start..."
screen -S $SCREEN_NAME -X stuff "sh /root/NFWC/run.sh\n"
sleep 60
if pgrep -x "$PROCESS_NAME" > /dev/null;then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Start Success. Welcome!"
fi
done
screen -S $SCREEN_NAME -X stuff "/list\n"
sleep 2
#读取log,获取玩家数量
latest_output=$(tail -n 1 $LOG_FILE)
number_of_player=$(echo "$latest_output" | grep -oP 'There are \K[0-9]+' )
#检查玩家数量
if [ -z "$number_of_player" ];then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] No number found in log output"
else
#检测0
if [ "$number_of_player" -eq "0" ];then
let count=count+1
echo "$count" > "$COUNT_FILE"
if [ "$count" -eq "$MAX_COUNT" ];then
back_up
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Stop the game."
screen -S "$SCREEN_NAME" -X stuff "stop\n"
while pgrep -x "$PROCESS_NAME" > /dev/null; do
sleep 5
done
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Stop the screen."
screen -S "$SCREEN_NAME" -X quit
sleep 2
sudo reboot
fi
else
if [ $count -ne "0" ];then
start_time=$(date +%s) > /dev/null 2>&1
fi
end_time=$(date +%s) > /dev/null 2>&1
cost_time=$(( end_time - start_time)) > /dev/null 2>&1
if [ "$cost_time" -ge "$BACKUP_TIME" ] ; then
start_time=$(date +%s) > /dev/null 2>&1
back_up
fi
#更新count
count=0
echo "$count" > "$COUNT_FILE"
sleep 60
fi
fi
sleep 60
done
浙公网安备 33010602011771号