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