#!/usr/bin/bash
# Author : yingjian
# Version : v1.2
# Date : 2023-06-08

if [ $# -ne 1 ];then
    echo "当前传入参数错误。"
    echo "Please bash check_game_process.sh \$1 {例如 mengdou} "
    exit 2
fi

#获取本机 公网 ip地址
local_ip=$(/bin/curl http://metadata.tencentyun.com/meta-data/public-ipv4)
echo $local_ip

#获取当前日期
date_dir=`date "+%F"`

#获取7天前日期
date_seven_ago=`date -d "7 days ago" +%F`

#获取脚本目录
cd `dirname $0`
script_dir=`pwd`

#项目目录
plat_dir=$1
#游戏项目发行目录
game_dir=p7/${1}

#游戏服id记录文件
game_id_file=${plat_dir}_${local_ip}

check_log_dir=${script_dir}/logs

if [ ! -d $check_log_dir ];then
     mkdir -p $check_log_dir
fi

[ -e /tmp/fd1 ] || mkfifo /tmp/fd1
#创建文件描述符，以可读（<）可写（>）的方式关联管道文件，这时候文件描述符3就有了有名管道文件的所有特性
exec 5<>/tmp/fd1
#关联后的文件描述符拥有管道文件的所有特性,所以这时候管道文件可以删除，我们留下文件描述符来用就可以了
rm -rf /tmp/fd1
for ((i=1;i<=5;i++))
do
  echo >&5  ##&3代表引用文件描述符3，这条命令代表往管道里面放入了一个"令牌",要对应exec 3<>/tmp/fd1
done


#检测游戏进程是否存活
check_process () {
while read line
do
read -u5
{
  game_process_pid=`ps -ef |grep /${game_dir}/$line/runtime |grep -v grep |awk '{print $2}'`
#判断获取进程pid是否为空
  if [ -n "$game_process_pid" ]; then
    echo "`date "+%Y-%m-%d %H:%M:%S"` 该游戏服id: ${line}  进程pid: $game_process_pid" >> ${check_log_dir}/${date_dir}_game_process.log
  else
    echo "`date "+%Y-%m-%d %H:%M:%S"` 该游戏进程不存在 该游戏服id为：${line}" >> ${check_log_dir}/${date_dir}_game_err_process.log
    /usr/bin/python3 ${script_dir}/feishu.py "告警时间 : `date "+%Y-%m-%d %H:%M:%S"`,平台名称 : ${plat_dir},游戏服: ${line},告警原因 : 游戏进程不存在"
#启动已经挂掉游戏进程
    if [ "${line}" -ge 1 ] && [ "${line}" -le 99999 ];then
      sudo /usr/bin/bash /${game_dir}/${line}/server_upload/server_ctrl_auto.sh start release >> ${check_log_dir}/${date_dir}_game_err_process.log
    else
      sudo /usr/bin/bash /${game_dir}/${line}/server_upload/server_ctrl_auto.sh cross_start release >> ${check_log_dir}/${date_dir}_game_err_process.log
    fi
    sleep 15
    re_game_process_pid=`ps -ef |grep /${game_dir}/$line/runtime |grep -v grep |awk '{print $2}'`
    if [ -n "$re_game_process_pid" ]; then
      /usr/bin/python3 ${script_dir}/feishu.py "告警时间 : `date "+%Y-%m-%d %H:%M:%S"`,平台名称 : ${plat_dir},游戏服: ${line},告警原因 : 游戏进程已恢复,进程id ：${re_game_process_pid}"
    fi
  fi
  echo >&5
}&
done < ${script_dir}/${game_id_file}
wait
}

check_process

rm -f ${check_log_dir}/${date_seven_ago}*
