227 lines
6.9 KiB
Bash
227 lines
6.9 KiB
Bash
#!/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
|