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