#!/bin/bash

# 日志轮换函数
rotate_log() {
  local LOG_FILE="$1"    # 日志文件路径
  local MAX_SIZE="$2"    # 最大日志文件大小（如 50M）
  local MAX_BACKUPS="$3" # 保留的最大备份数量

  # 如果日志文件是 /dev/null，直接返回，不进行轮换
  if [ "$LOG_FILE" == "/dev/null" ]; then
    echo "日志文件是 /dev/null，跳过日志轮换"
    return
  fi

  local LOG_DIR=$(dirname "$LOG_FILE")       # 日志文件所在的目录
  local DATE_FORMAT=$(date +"%Y%m%d-%H%M%S") # 当前日期和时间格式

  # 检查日志文件是否存在
  if [ ! -f "$LOG_FILE" ]; then
    echo "日志文件不存在，创建新日志文件: $LOG_FILE"
    touch "$LOG_FILE"
  fi

  # 检查日志文件的大小
  log_size=$(stat -c %s "$LOG_FILE")            # 获取日志文件的大小（字节）
  max_size_bytes=$(numfmt --from=iec $MAX_SIZE) # 转换最大大小为字节

  # 如果日志文件大小超过限制，进行轮换
  if [ "$log_size" -ge "$max_size_bytes" ]; then
    echo "日志文件超过最大限制 $MAX_SIZE，开始轮换日志"

    # 创建备份目录（如果没有的话）
    mkdir -p "$LOG_DIR/backups"

    # 获取备份文件名
    backup_file="${LOG_DIR}/backups/$(basename "$LOG_FILE").${DATE_FORMAT}"

    #        # 备份当前日志文件
    #        mv "$LOG_FILE" "$backup_file"
    #        echo "备份日志为: $backup_file"
    #
    #        # 创建一个新的空日志文件
    #        touch "$LOG_FILE"

    # 复制当前日志作为备份（不动 inode）
    cp "$LOG_FILE" "$backup_file"
    echo "备份日志为: $backup_file"

    # 截断原日志文件（FD 不变）
    : >"$LOG_FILE"

    # 压缩备份日志文件
    gzip "$backup_file"
    echo "压缩备份日志为: ${backup_file}.gz"

    # 删除多余的备份文件（如果超过最大保留数量）
    backups_count=$(ls "$LOG_DIR/backups" | grep -E "^$(basename "$LOG_FILE")" | wc -l)
    if [ "$backups_count" -gt "$MAX_BACKUPS" ]; then
      # 删除最早的备份
      oldest_backup=$(ls -t "$LOG_DIR/backups" | grep -E "^$(basename "$LOG_FILE")" | tail -n 1)
      rm "${LOG_DIR}/backups/$oldest_backup"
      echo "删除最早的备份日志: ${LOG_DIR}/backups/$oldest_backup"
    fi
  fi
}

DIR="$(cd "$(dirname "$0")" && pwd)"
BOOT_TIME=$(uptime -s) # 使用 uptime 命令获取系统的开机时间
MAX_SIZE="1M"          # 最大日志文件大小
MAX_BACKUPS=2          # 保留的最大备份数量
# 自动崩溃收集服务
#sudo systemctl stop apport.service
#sudo systemctl disable apport.service
#ulimit -c unlimited
#echo "/home/heco/ys_ecap_server/core/core_%e_${BOOT_TIME}_.%t.%p" | tee /proc/sys/kernel/core_pattern

USE_VALGRIND=0
USE_data_process=0

NAME1="data_process"
NAME2="ecap_server"
#LOG_PATH1="/dev/null"
#LOG_PATH2="/dev/null"
LOG_PATH1="$DIR/data_process.log"
LOG_PATH2="$DIR/ecap_server.log"

if [ "$USE_data_process" == 1 ]; then
  rotate_log "$LOG_PATH1" "$MAX_SIZE" "$MAX_BACKUPS"
fi

rotate_log "$LOG_PATH2" "$MAX_SIZE" "$MAX_BACKUPS"

# Ensure the log files exist and are writable
if [ "$USE_data_process" == 1 ]; then
  echo "系统开机时间: $BOOT_TIME" >>"${LOG_PATH1}"
  touch "${LOG_PATH1}"
fi

echo "系统开机时间: $BOOT_TIME" >>"${LOG_PATH2}"
touch "${LOG_PATH2}"
echo "${DIR} 创建log文件成功"

if [ "$USE_VALGRIND" == 1 ]; then
  echo "启用valgrind内存检查程序"
  valgrind --leak-check=full --log-file=${DIR}/${NAME2}_valgrind.log --show-leak-kinds=all ${DIR}/${NAME2} >>"${LOG_PATH2}" 2>&1 &
fi

SLEEP_SEC="${1:-10}"
sleep "$SLEEP_SEC"
echo "等待 ${SLEEP_SEC}s 完成"

if [ "$USE_data_process" == 1 ]; then
  echo "第一次启动 ${NAME1}"
  ${DIR}/${NAME1} >>"${LOG_PATH1}" 2>&1 &
  if [ $? -ne 0 ]; then
    echo "第一次启动 Failed to start ${NAME1} at $(date)" >>"${LOG_PATH1}"
  fi
fi

restart_count_2=0
echo "第一次启动 ${NAME2}"
${DIR}/${NAME2} >>"${LOG_PATH2}" 2>&1 &
if [ $? -ne 0 ]; then
  echo "第一次启动 Failed to start ${NAME2} at $(date)" >>"${LOG_PATH2}"
fi

while true; do
  # 监控 data_process

  if [ "$USE_data_process" == 1 ]; then
    if ! pgrep -x "$NAME1" >/dev/null; then
      restart_count_1=$((restart_count_1 + 1))
      echo "重启 ${NAME1} at $(date) - count: ${restart_count_1}" >>"${LOG_PATH1}"
      echo "重启 ${NAME1} at $(date) - count: ${restart_count_1}"

      # 真正重启程序
      ${DIR}/${NAME1} >>"${LOG_PATH1}" 2>&1 &
      if [ $? -ne 0 ]; then
        echo "Failed to start ${NAME1} at $(date)" >>"${LOG_PATH1}"
      fi
    fi
  fi

  sleep 60

  # 监控 ecap_server
  if [ "$USE_VALGRIND" == 0 ]; then
    if ! pgrep -x "$NAME2" >/dev/null; then

      ss -ltnp >>"${LOG_PATH2}"
      restart_count_2=$((restart_count_2 + 1))
      echo "重启 ${NAME2} at $(date) - count: ${restart_count_2}" >>"${LOG_PATH2}"
      echo "重启 ${NAME2} at $(date) - count: ${restart_count_2}"
      # 真正启动
      ${DIR}/${NAME2} >>"${LOG_PATH2}" 2>&1 &
      if [ $? -ne 0 ]; then
        echo "Failed to start ${NAME2} at $(date)" >>"${LOG_PATH2}"
      fi
    fi
  fi

  if [ "$USE_data_process" == 1 ]; then
    rotate_log "$LOG_PATH1" "$MAX_SIZE" "$MAX_BACKUPS"
  fi

  rotate_log "$LOG_PATH2" "$MAX_SIZE" "$MAX_BACKUPS"

done

#  tail -f /home/heco/ys_ecap_server/ecap_1201/data_process.log
#  tail -f /home/heco/ys_ecap_server/ecap_1201/ecap_server.log
# multitail /home/heco/ys_ecap_server/ecap_1201/data_process.log /home/heco/ys_ecap_server/ecap_1201/ecap_server.log

#   kill -SIGINT <pid>
#   pkill -SIGINT <process-name>
#   pkill -SIGINT 1125ecap_server
#   pgrep -l 1125ecap_server
#  [ubuntu创建守护进程，并设置开机自启动(rc.local,rc_local.sercive)] https://blog.csdn.net/weixin_46954054/article/details/134862013
#  [Ubuntu开机自启动脚本/命令的几种方案] https://blog.csdn.net/weixin_43455581/article/details/107815743

# sudo pkill protect.bash && sudo pkill -SIGINT ecap_server && pgrep -l protect.bash

#  pgrep -l protect.bash
# sudo pkill protect.bash
# sudo pkill -SIGINT  ecap_server

# /home/heco/ys_ecap_server/protect.bash ecap_server

#   kill -SIGINT <pid>
#   pkill -SIGINT <process-name>
#   pkill -SIGINT 1125ecap_server
#   pgrep -l 1125ecap_server
#  [ubuntu创建守护进程，并设置开机自启动(rc.local,rc_local.sercive)] https://blog.csdn.net/weixin_46954054/article/details/134862013
#  [Ubuntu开机自启动脚本/命令的几种方案] https://blog.csdn.net/weixin_43455581/article/details/107815743

#  pgrep -l protect.bash
#  pkill protect.bash

# /home/heco/ys_ecap_server/protect.bash ecap_server

# sudo systemctl daemon-reload
# sudo systemctl enable rc-local.service   # 设置开机自启
# sudo systemctl disable rc-local.service  # 关闭开机自启
# sudo systemctl start rc-local.service    # 立即启动服务
# sudo systemctl status rc-local.service
