提交 7867a7a4 authored 作者: 陈泽健's avatar 陈泽健

Merge remote-tracking branch 'origin/develop' into develop

......@@ -4,7 +4,7 @@
CONTAINER_NAME="umysql"
DB_USER="root"
HOST_BACKUP_DIR="/opt/mysql" # 宿主机备份目录
LOG_FILE="/var/log/backup_mysql_databases.log"
LOG_FILE="/var/log/scripts/backup_mysql_databases.log"
RETENTION_DAYS=30
TARGET_DBS=("devops" "devops_voice" "huazhao2" "nacos_mysql" "offline" "ubains" "wifi" "voice" "ubains_nacos_config" "ubains_sso")
......
#!/bin/bash
# ==================== 配置区 ====================
MYSQL_LOG_DIR="/opt/mysql/logs" # MySQL日志目录
BACKUP_DIR="/opt/mysql/logs/backup" # 备份目录
LOG_FILE="/var/log/scripts/backup_mysql_logs.log" # 日志文件路径
RETENTION_DAYS=30 # 保留天数
DATE=$(date +"%Y%m%d") # 当前日期格式 YYYYMMDD
TODAY_DIR="$BACKUP_DIR/$DATE" # 今天的备份目录
# ==================== 日志函数 ====================
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}
# ==================== 权限保存和恢复函数 ====================
save_permissions() {
local file="$1"
# 获取文件权限和属主信息
local perms owner group
perms=$(stat -c %a "$file" 2>/dev/null)
owner=$(stat -c %U "$file" 2>/dev/null)
group=$(stat -c %G "$file" 2>/dev/null)
# 存储到临时文件
echo "$perms $owner $group" > "$file.permissions.tmp"
}
restore_permissions() {
local file="$1"
local perm_file="$file.permissions.tmp"
if [ -f "$perm_file" ]; then
local perms owner group
read -r perms owner group < "$perm_file"
# 恢复权限和属主
chown "$owner:$group" "$file" 2>/dev/null
chmod "$perms" "$file" 2>/dev/null
# 删除临时权限文件
rm -f "$perm_file"
fi
}
# ==================== 主要功能 ====================
log "===== 开始备份MySQL日志 (日期: $DATE) ====="
# 创建备份目录
mkdir -p "$TODAY_DIR"
touch "$LOG_FILE"
# 检查MySQL日志目录是否存在
if [ ! -d "$MYSQL_LOG_DIR" ]; then
log "❌ MySQL日志目录不存在: $MYSQL_LOG_DIR"
exit 1
fi
# 进入日志目录
cd "$MYSQL_LOG_DIR" || {
log "❌ 无法进入目录: $MYSQL_LOG_DIR"
exit 1
}
# 查找所有日志文件(包括 .log 和 .slow 文件)
LOG_FILES=$(find "$MYSQL_LOG_DIR" -maxdepth 1 \( -name "*.log" -o -name "*.slow" -o -name "error.log" -o -name "slow.log" -o -name "mysqld.log" \) -type f)
if [ -z "$LOG_FILES" ]; then
log "⚠️ 在 $MYSQL_LOG_DIR 中未找到日志文件"
exit 0
fi
# 备份并压缩每个日志文件
SUCCESS_COUNT=0
for log_file in $LOG_FILES; do
filename=$(basename "$log_file")
source_path="$MYSQL_LOG_DIR/$filename"
# 跳过已经备份过的文件(如果同名备份已存在)
if [ -f "$TODAY_DIR/${filename}.gz" ]; then
log "⚠️ 备份文件已存在,跳过: $filename"
continue
fi
log "开始备份日志文件: $filename"
# 保存原始权限信息
save_permissions "$source_path"
# 复制文件到备份目录并压缩
if gzip -c "$source_path" > "$TODAY_DIR/${filename}_${DATE}.gz"; then
log "✅ 日志备份并压缩成功: $filename -> ${filename}_${DATE}.gz"
((SUCCESS_COUNT++))
else
log "❌ 日志备份失败: $filename"
# 如果备份失败,仍需要恢复权限信息
restore_permissions "$source_path"
fi
# 恢复原始文件权限
restore_permissions "$source_path"
done
log "本次共成功备份 $SUCCESS_COUNT 个日志文件"
# ==================== 清理超过30天的旧备份 ====================
log "开始清理超过 $RETENTION_DAYS 天的旧备份..."
find "$BACKUP_DIR" -maxdepth 1 -type d -name "????????" -mtime +$RETENTION_DAYS -exec rm -rf {} + 2>/dev/null
# 清理权限临时文件(以防万一)
find "$MYSQL_LOG_DIR" -name "*.permissions.tmp" -type f -delete 2>/dev/null
log "===== 日志备份任务结束 ====="
\ No newline at end of file
#!/bin/bash
# ==================== 配置区 ====================
NGINX_LOG_DIR="/var/www/java/nginx-conf.d/nginx_log" # Nginx日志目录
BACKUP_DIR="$NGINX_LOG_DIR/backup" # 备份目录
LOG_FILE="/var/log/scripts/backup_nginx_logs.log" # 日志文件路径
RETENTION_DAYS=30 # 保留天数
DATE=$(date +"%Y%m%d") # 当前日期格式 YYYYMMDD
TODAY_DIR="$BACKUP_DIR/$DATE" # 今天的备份目录
# ==================== 日志函数 ====================
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}
# ==================== 权限保存和恢复函数 ====================
save_permissions() {
local file="$1"
# 获取文件权限和属主信息
local perms owner group
perms=$(stat -c %a "$file" 2>/dev/null)
owner=$(stat -c %U "$file" 2>/dev/null)
group=$(stat -c %G "$file" 2>/dev/null)
# 存储到临时文件
echo "$perms $owner $group" > "$file.permissions.tmp"
}
restore_permissions() {
local file="$1"
local perm_file="$file.permissions.tmp"
if [ -f "$perm_file" ]; then
local perms owner group
read -r perms owner group < "$perm_file"
# 恢复权限和属主
chown "$owner:$group" "$file" 2>/dev/null
chmod "$perms" "$file" 2>/dev/null
# 删除临时权限文件
rm -f "$perm_file"
fi
}
# ==================== 主要功能 ====================
log "===== 开始备份Nginx日志 (日期: $DATE) ====="
# 创建备份目录
mkdir -p "$TODAY_DIR"
touch "$LOG_FILE"
# 检查Nginx日志目录是否存在
if [ ! -d "$NGINX_LOG_DIR" ]; then
log "❌ Nginx日志目录不存在: $NGINX_LOG_DIR"
exit 1
fi
# 进入日志目录
cd "$NGINX_LOG_DIR" || {
log "❌ 无法进入目录: $NGINX_LOG_DIR"
exit 1
}
# 查找所有日志文件(access.log 和 error.log)
LOG_FILES=""
if [ -f "access.log" ]; then
LOG_FILES="$LOG_FILES access.log"
fi
if [ -f "error.log" ]; then
LOG_FILES="$LOG_FILES error.log"
fi
if [ -z "$LOG_FILES" ]; then
log "⚠️ 在 $NGINX_LOG_DIR 中未找到Nginx日志文件"
exit 0
fi
# 备份并压缩每个日志文件
SUCCESS_COUNT=0
for log_file in $LOG_FILES; do
source_path="$NGINX_LOG_DIR/$log_file"
# 跳过已经备份过的文件(如果同名备份已存在)
if [ -f "$TODAY_DIR/${log_file}_${DATE}.gz" ]; then
log "⚠️ 备份文件已存在,跳过: $log_file"
continue
fi
log "开始备份日志文件: $log_file"
# 保存原始权限信息
save_permissions "$source_path"
# 复制文件到备份目录并压缩
if gzip -c "$source_path" > "$TODAY_DIR/${log_file}_${DATE}.gz"; then
log "✅ 日志备份并压缩成功: $log_file -> ${log_file}_${DATE}.gz"
((SUCCESS_COUNT++))
# 清空原始日志文件内容,但保持文件存在
> "$source_path"
log "✅ 原始日志文件已清空: $log_file"
else
log "❌ 日志备份失败: $log_file"
# 如果备份失败,仍需要恢复权限信息
restore_permissions "$source_path"
fi
# 恢复原始文件权限
restore_permissions "$source_path"
done
log "本次共成功备份 $SUCCESS_COUNT 个日志文件"
# ==================== 清理超过30天的旧备份 ====================
log "开始清理超过 $RETENTION_DAYS 天的旧备份..."
find "$BACKUP_DIR" -maxdepth 1 -type d -name "????????" -mtime +$RETENTION_DAYS -exec rm -rf {} + 2>/dev/null
# 清理权限临时文件(以防万一)
find "$NGINX_LOG_DIR" -name "*.permissions.tmp" -type f -delete 2>/dev/null
# 发送HUP信号给nginx进程,使其重新打开日志文件
if command -v nginx &> /dev/null; then
nginx -s reopen 2>/dev/null || {
# 如果直接执行失败,尝试通过docker向ujava2容器发送信号
docker exec ujava2 nginx -s reopen 2>/dev/null || log "⚠️ 无法向Nginx发送reopen信号"
}
elif docker ps --format '{{.Names}}' | grep -q "ujava2"; then
# 如果nginx命令不存在,但容器存在,则尝试在容器内执行
docker exec ujava2 nginx -s reopen 2>/dev/null || log "⚠️ 无法向Nginx发送reopen信号"
fi
log "===== Nginx日志备份任务结束 ====="
\ No newline at end of file
#!/bin/bash
# clear_deleted_files.sh - 定时清理被进程占用的已删除文件
LOG_FILE="/var/log/cleanup_deleted_files.log"
LOG_FILE="/var/log/scripts/cleanup_deleted_files.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$DATE] 开始检查被占用的已删除文件..." >> "$LOG_FILE"
......
#!/bin/bash
# 宿主机上的脚本:检查 EMQX,如果容器未运行则重启 uemqx 容器
LOG_FILE="/var/log/monitor_emqx_service.log"
LOG_FILE="/var/log/scripts/monitor_emqx_service.log"
log() {
local message
......
......@@ -2,7 +2,7 @@
# --- 配置区域 ---
# 日志文件路径
LOG_FILE="/var/log/monitor_external_api_services.log"
LOG_FILE="/var/log/scripts/monitor_external_api_services.log"
# 定义要监控的服务及其相关信息
# 格式: "进程名:目录路径:启动脚本路径"
......
......@@ -38,7 +38,7 @@ MALAN_DIR="/var/www/malan"
MALAN_PORT="6060"
# 日志配置
LOG_FILE="/var/log/monitor-inner-api-services.log"
LOG_FILE="/var/log/scripts/monitor-inner-api-services.log"
# 超时配置
START_TIMEOUT=30
......
#!/bin/bash
# 宿主机上的脚本:检查 MySQL,如果容器未运行则重启 umysql 容器
LOG_FILE="/var/log/monitor_mysql_service.log"
LOG_FILE="/var/log/scripts/monitor_mysql_service.log"
log() {
local message
......
#!/bin/bash
# 宿主机上的脚本:检查 Redis,如果容器未运行则重启 uredis 容器
LOG_FILE="/var/log/monitor_redis_service.log"
LOG_FILE="/var/log/scripts/monitor_redis_service.log"
log() {
local message
......
# 预定系统定时任务配置说明
## 一、目录结构说明
- **脚本存放目录**:`/opt/scripts/`
- **日志文件目录**:`/var/log/scripts/`
- **日志文件命名规则**:`脚本名.log`
## 二、部署步骤
1. **上传脚本文件**:将所有定时任务脚本上传至服务器的 `/opt/scripts` 目录下
2. **设置脚本权限**:
```bash
chmod +x /opt/scripts/*.sh
```
3. **创建日志目录**(如果不存在):
```bash
sudo mkdir -p /var/log/scripts/
```
## 三、定时任务配置
执行以下命令编辑 crontab:
```bash
crontab -e
```
添加以下定时任务配置:
```
# ==================== 预定系统定时任务配置 ====================
# 每日凌晨1点备份MySQL数据库
0 1 * * * /opt/scripts/backup_mysql_databases.sh
# 每日凌晨2点备份MySQL日志
0 2 * * * /opt/scripts/backup_mysql_logs.sh
# 每日凌晨3点备份Nginx日志
0 3 * * * /opt/scripts/backup_nginx_logs.sh
# 每日凌晨4点检查并清理被占用的已删除文件
0 4 * * * /opt/scripts/cleanup_deleted_files.sh
# 每5分钟监测EMQX服务状态
*/5 * * * * /opt/scripts/monitor_emqx_service.sh
# 每5分钟监测外部API服务状态
*/5 * * * * /opt/scripts/monitor_external_api_services.sh
# 每5分钟监测内部API服务状态
*/5 * * * * /opt/scripts/monitor_inner_api_services.sh
# 每5分钟监测MySQL服务状态
*/5 * * * * /opt/scripts/monitor_mysql_service.sh
# 每5分钟监测Redis服务状态
*/5 * * * * /opt/scripts/monitor_redis_service.sh
# ==================== 定时任务结束 ====================
```
## 四、注意事项
1. **日志输出**:所有脚本已在内部实现日志输出功能,无需在 crontab 中重定向输出
2. **权限要求**:某些脚本可能需要特定权限才能正常运行,确保脚本具有足够的权限访问所需资源
3. **服务依赖**:确保相关服务(如 Docker、Nginx、MySQL 等)在执行脚本前处于运行状态
4. **监控日志**:定期检查 `/var/log/scripts/` 目录下的日志文件,确认各脚本正常运行
5. **备份保留**:日志和备份文件会保留30天,如需调整保留时间请修改脚本中的 RETENTION_DAYS 参数
## 五、故障排查
1. **检查脚本权限**:
```bash
ls -la /opt/scripts/
```
2. **检查定时任务是否生效**:
```bash
crontab -l
```
3. **查看日志文件**:
```bash
tail -f /var/log/scripts/脚本名.log
```
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论