mc服务器自重启/自备份脚本

设置开机自启动之后通过死循环保证运行
如何创建文件并设置自启动可以查看下面的链接
Ubuntu/Linux脚本创建方法
创建名为MC的screen,让mc后台运行
每次循环都检测screen是否存在,以及游戏进程java是否存在
如果上述两个不存在则尝试启动
如果存在之后则每次通过/list命令获取在线人数,使用count.log计算 “有几次检测到在线玩家为0”
当这个数量达到了MAX_COUNT,则备份、关闭游戏、重启服务器
重启之后该值会超过max,不再触发重启,直到有人进入将count.log的值更新为0
当服务器有人时,会因为count.lot值未更新而更新一次starttime,之后starttime保持不变,每当运行时间超过20000秒,则进行一次备份,不会导致游戏重启

#!/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

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"
	tar -cf /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 

进行了一些小更新,主要是给save-on指令留了个时间

screen -S "$SCREEN_NAME" -X stuff "/save-all\n"
sleep 5
tar -cf /data/backup/$(date +%Y%m%d_%H%M%S).tar.gz /root/NFWC/world