提交 04219d8d authored 作者: 陈泽健's avatar 陈泽健

feat(scripts): 新增多个定时任务并重构入口函数

- 新增 MySQL 备份定时任务,每周五凌晨执行
- 新增 Redis 服务监控定时任务,每 5 分钟执行
- 新增 EMQX 服务监控定时任务,每 5 分钟执行
- 新增 Nginx 日志备份定时任务,每天凌晨 3 点执行
- 新增 MySQL 日志备份定时任务,每天凌晨 2 点执行
- 新增自动清理已删除 ubains 定时任务,每天凌晨 4 点执行
- 将原 add_crontab_job 重命名为 _add_single_cron_job 作为内部函数
- 创建新的 add_crontab_job 作为入口函数,支持参数解析和批量配置
- 更新参数控制设计,支持 --enable-xxx / --disable-xxx 参数组合
- 修改 ujava2-startup 任务名为 ujava2,统一命名规范
- 添加函数式调用方式,避免 main 函数命名冲突
- 更新测试用例覆盖函数和脚本两种调用方式
- 同步更新 EMQX 服务监控需求文档,包含完整功能说明
上级 2747889d
...@@ -16,23 +16,53 @@ ...@@ -16,23 +16,53 @@
- 定时周期:每天凌晨01:00执行 - 定时周期:每天凌晨01:00执行
- 定时任务执行脚本:`/data/services/scripts/check_server_health.sh` - 定时任务执行脚本:`/data/services/scripts/check_server_health.sh`
- 需要先判断该路径是否存在脚本,若不存在则不进行配置,打印相关日志记录。 - 需要先判断该路径是否存在脚本,若不存在则不进行配置,打印相关日志记录。
- 新增定时任务:
- 定时周期:每周五凌晨1点执行
- 定时任务执行脚本:`/data/services/scripts/UbainsmysqlBakUp`
- 需要先判断该路径是否存在脚本,若不存在则不进行配置,打印相关日志记录。
- 新增定时任务:
- 定时周期:*/5 * * * *
- 定时任务执行脚本:`/data/services/scripts/monitor_redis_service.sh`
- 需要先判断该路径是否存在脚本,若不存在则不进行配置,打印相关日志记录。
- 新增定时任务:
- 定时周期:*/5 * * * *
- 定时任务执行脚本:`/data/services/scripts/monitor_emqx_service.sh`
- 新增定时任务:
- 定时周期:0 3 * * *
- 定时任务执行脚本:`/data/services/scripts/backup_nginx_logs.sh`
- 需要先判断该路径是否存在脚本,若不存在则不进行配置,打印相关日志记录。
- 新增定时任务:
- 定时周期:0 2 * * *
- 定时任务执行脚本:`/data/services/scripts/backup_mysql_logs.sh`
- 需要先判断该路径是否存在脚本,若不存在则不进行配置,打印相关日志记录。
- 新增定时任务:
- 定时周期:0 4 * * *
- 定时任务执行脚本:`/data/services/scripts/auto_clean_deleted_ubains_v3.sh`
- 需要先判断该路径是否存在脚本,若不存在则不进行配置,打印相关日志记录。
#### 参数控制设计 #### 参数控制设计
- **参数方式:** 使用 `--enable-xxx` / `--disable-xxx` 开关式参数 - **参数方式:** 使用 `--enable-xxx` / `--disable-xxx` 开关式参数
- **默认行为:** 不传参数时默认全部启用(向后兼容) - **默认行为:** 不传参数时默认全部启用(向后兼容)
- **调用方式:**
- 方式1:直接调用脚本 `./auto_crontab_settings.sh [参数]`
- 方式2:在主脚本中调用函数 `add_crontab_job [参数]`(避免 main 函数命名冲突)
- **参数示例:** - **参数示例:**
```bash ```bash
# 默认全部启用 # 默认全部启用
./auto_crontab_settings.sh ./auto_crontab_settings.sh
add_crontab_job
# 只启用 check_server_health # 只启用 check_server_health
./auto_crontab_settings.sh --disable-ujava2 ./auto_crontab_settings.sh --disable-ujava2
add_crontab_job --disable-ujava2
# 禁用 check_server_health # 禁用 check_server_health
./auto_crontab_settings.sh --disable-check-health ./auto_crontab_settings.sh --disable-check-health
add_crontab_job --disable-check-health
# 显式启用指定任务 # 显式启用指定任务
./auto_crontab_settings.sh --enable-ujava2 --enable-check-health ./auto_crontab_settings.sh --enable-ujava2 --enable-check-health
add_crontab_job --enable-ujava2 --enable-check-health
``` ```
## 疑问与解答记录 ## 疑问与解答记录
...@@ -89,6 +119,14 @@ ...@@ -89,6 +119,14 @@
- **问题:** 如果调用时不传任何参数,默认应该启用哪些任务? - **问题:** 如果调用时不传任何参数,默认应该启用哪些任务?
- **解答:** 默认全部启用(向后兼容现有行为)。 - **解答:** 默认全部启用(向后兼容现有行为)。
### 疑问15:主脚本调用方式?
- **问题:** 主脚本 `new_auto.sh` 如何调用 `auto_crontab_settings.sh`?直接调用脚本还是调用函数?
- **解答:** 使用 `add_crontab_job` 函数作为入口,避免 `main` 函数命名冲突。该函数支持参数传递,功能等同于直接调用脚本。
### 疑问16:函数命名设计?
- **问题:** 原有的 `add_crontab_job` 是添加单个任务的函数,现在要改成入口函数,如何处理?
- **解答:** 将原 `add_crontab_job` 重命名为 `_add_single_cron_job`(内部函数),新的 `add_crontab_job` 作为入口函数,负责参数解析和批量任务配置。
### 疑问14:参数冲突如何处理? ### 疑问14:参数冲突如何处理?
- **问题:** 如果同时传入矛盾的参数(如 `--enable-xxx``--disable-xxx`),如何处理? - **问题:** 如果同时传入矛盾的参数(如 `--enable-xxx``--disable-xxx`),如何处理?
- **解答:** 如果重复传参(同时启用和禁用同一任务),则跳过该任务配置并打印警告日志。 - **解答:** 如果重复传参(同时启用和禁用同一任务),则跳过该任务配置并打印警告日志。
......
...@@ -32,6 +32,36 @@ TASK_SCRIPT[mysql_backup]="/data/services/scripts/UbainsmysqlBakUp.sh" ...@@ -32,6 +32,36 @@ TASK_SCRIPT[mysql_backup]="/data/services/scripts/UbainsmysqlBakUp.sh"
TASK_LOG[mysql_backup]="" TASK_LOG[mysql_backup]=""
TASK_STATUS[mysql_backup]=true # 默认启用 TASK_STATUS[mysql_backup]=true # 默认启用
# monitor_redis 任务定义
TASK_CRON[monitor_redis]="*/5 * * * *"
TASK_SCRIPT[monitor_redis]="/data/services/scripts/monitor_redis_service.sh"
TASK_LOG[monitor_redis]=""
TASK_STATUS[monitor_redis]=true # 默认启用
# monitor_emqx 任务定义
TASK_CRON[monitor_emqx]="*/5 * * * *"
TASK_SCRIPT[monitor_emqx]="/data/services/scripts/monitor_emqx_service.sh"
TASK_LOG[monitor_emqx]=""
TASK_STATUS[monitor_emqx]=true # 默认启用
# nginx_backup 任务定义
TASK_CRON[nginx_backup]="0 3 * * *"
TASK_SCRIPT[nginx_backup]="/data/services/scripts/backup_nginx_logs.sh"
TASK_LOG[nginx_backup]=""
TASK_STATUS[nginx_backup]=true # 默认启用
# mysql_logs_backup 任务定义
TASK_CRON[mysql_logs_backup]="0 2 * * *"
TASK_SCRIPT[mysql_logs_backup]="/data/services/scripts/backup_mysql_logs.sh"
TASK_LOG[mysql_logs_backup]=""
TASK_STATUS[mysql_logs_backup]=true # 默认启用
# auto_clean 任务定义
TASK_CRON[auto_clean]="0 4 * * *"
TASK_SCRIPT[auto_clean]="/data/services/scripts/auto_clean_deleted_ubains_v3.sh"
TASK_LOG[auto_clean]=""
TASK_STATUS[auto_clean]=true # 默认启用
# 初始化 sudo 相关变量 # 初始化 sudo 相关变量
if [[ $(id -u) -ne 0 ]]; then if [[ $(id -u) -ne 0 ]]; then
SUDO="sudo" SUDO="sudo"
...@@ -58,7 +88,12 @@ function show_help() { ...@@ -58,7 +88,12 @@ function show_help() {
cat << EOF cat << EOF
定时任务配置脚本 定时任务配置脚本
用法: $0 [选项] 用法(直接调用脚本):
$0 [选项]
用法(主脚本中调用函数):
source $0
add_crontab_job [选项]
选项: 选项:
--enable-ujava2 启用 ujava2-startup 定时任务 --enable-ujava2 启用 ujava2-startup 定时任务
...@@ -69,17 +104,35 @@ function show_help() { ...@@ -69,17 +104,35 @@ function show_help() {
--disable-mysql-backup 禁用 mysql_backup 定时任务 --disable-mysql-backup 禁用 mysql_backup 定时任务
--enable-mysql 启用 mysql_backup 定时任务(别名) --enable-mysql 启用 mysql_backup 定时任务(别名)
--disable-mysql 禁用 mysql_backup 定时任务(别名) --disable-mysql 禁用 mysql_backup 定时任务(别名)
--enable-monitor-redis 启用 monitor_redis 定时任务
--disable-monitor-redis 禁用 monitor_redis 定时任务
--enable-monitor-emqx 启用 monitor_emqx 定时任务
--disable-monitor-emqx 禁用 monitor_emqx 定时任务
--enable-nginx-backup 启用 nginx_backup 定时任务
--disable-nginx-backup 禁用 nginx_backup 定时任务
--enable-mysql-logs-backup 启用 mysql_logs_backup 定时任务
--disable-mysql-logs-backup 禁用 mysql_logs_backup 定时任务
--enable-auto-clean 启用 auto_clean 定时任务
--disable-auto-clean 禁用 auto_clean 定时任务
-h, --help 显示此帮助信息 -h, --help 显示此帮助信息
默认行为: 默认行为:
不传参数时,所有定时任务默认启用 不传参数时,所有定时任务默认启用
示例: 示例(脚本方式):
$0 # 默认启用所有任务 $0 # 默认启用所有任务
$0 --disable-ujava2 # 禁用 ujava2-startup $0 --disable-ujava2 # 禁用 ujava2-startup
$0 --enable-mysql-backup # 启用数据库备份 $0 --enable-mysql-backup # 启用数据库备份
$0 --disable-monitor-redis --disable-monitor-emqx # 禁用监控任务
$0 --enable-ujava2 --enable-check-health --enable-mysql-backup # 显式启用所有任务 $0 --enable-ujava2 --enable-check-health --enable-mysql-backup # 显式启用所有任务
示例(函数方式):
source $0 # 导入脚本
add_crontab_job # 默认启用所有任务
add_crontab_job --disable-ujava2 # 禁用 ujava2-startup
add_crontab_job --enable-mysql-backup # 启用数据库备份
add_crontab_job --disable-monitor-redis --disable-monitor-emqx # 禁用监控任务
EOF EOF
} }
...@@ -123,6 +176,61 @@ function parse_arguments() { ...@@ -123,6 +176,61 @@ function parse_arguments() {
TASK_STATUS[mysql_backup]=false TASK_STATUS[mysql_backup]=false
fi fi
;; ;;
--enable-monitor-redis)
TASK_STATUS[monitor_redis]=true
;;
--disable-monitor-redis)
if [[ "${TASK_STATUS[monitor_redis]}" == "false" ]]; then
log "WARN" "⚠️ 参数冲突:monitor_redis 同时被启用和禁用,跳过该任务"
TASK_STATUS[monitor_redis]=conflict
else
TASK_STATUS[monitor_redis]=false
fi
;;
--enable-monitor-emqx)
TASK_STATUS[monitor_emqx]=true
;;
--disable-monitor-emqx)
if [[ "${TASK_STATUS[monitor_emqx]}" == "false" ]]; then
log "WARN" "⚠️ 参数冲突:monitor_emqx 同时被启用和禁用,跳过该任务"
TASK_STATUS[monitor_emqx]=conflict
else
TASK_STATUS[monitor_emqx]=false
fi
;;
--enable-nginx-backup)
TASK_STATUS[nginx_backup]=true
;;
--disable-nginx-backup)
if [[ "${TASK_STATUS[nginx_backup]}" == "false" ]]; then
log "WARN" "⚠️ 参数冲突:nginx_backup 同时被启用和禁用,跳过该任务"
TASK_STATUS[nginx_backup]=conflict
else
TASK_STATUS[nginx_backup]=false
fi
;;
--enable-mysql-logs-backup)
TASK_STATUS[mysql_logs_backup]=true
;;
--disable-mysql-logs-backup)
if [[ "${TASK_STATUS[mysql_logs_backup]}" == "false" ]]; then
log "WARN" "⚠️ 参数冲突:mysql_logs_backup 同时被启用和禁用,跳过该任务"
TASK_STATUS[mysql_logs_backup]=conflict
else
TASK_STATUS[mysql_logs_backup]=false
fi
;;
--enable-auto-clean)
TASK_STATUS[auto_clean]=true
;;
--disable-auto-clean)
if [[ "${TASK_STATUS[auto_clean]}" == "false" ]]; then
log "WARN" "⚠️ 参数冲突:auto_clean 同时被启用和禁用,跳过该任务"
TASK_STATUS[auto_clean]=conflict
else
TASK_STATUS[auto_clean]=false
fi
;;
-h|--help) -h|--help)
show_help show_help
exit 0 exit 0
...@@ -180,10 +288,58 @@ function cleanup_crontab_jobs() { ...@@ -180,10 +288,58 @@ function cleanup_crontab_jobs() {
} }
# ======================================== # ========================================
# ✅ 函数:安全添加定时任务(通用版本) # ✅ 函数:配置定时任务(支持参数控制)
# 用途:作为主入口函数,支持 --enable-xxx/--disable-xxx 参数
# ======================================== # ========================================
function add_crontab_job() { function add_crontab_job() {
# 1. 解析传入的参数
parse_arguments "$@"
log "INFO" "=========================================="
log "INFO" "🚀 开始配置定时任务"
log "INFO" "=========================================="
# 2. 执行清理
cleanup_crontab_jobs
# 3. 根据任务状态配置任务
for task_name in "${!TASK_STATUS[@]}"; do
local status="${TASK_STATUS[$task_name]}"
# 跳过冲突任务
if [[ "$status" == "conflict" ]]; then
log "WARN" "⏭️ 任务 $task_name 参数冲突,已跳过"
continue
fi
# 跳过禁用任务
if [[ "$status" == "false" ]]; then
log "INFO" "⏭️ 任务 $task_name 已被禁用,跳过配置"
continue
fi
# 配置启用的任务(调用内部函数)
_add_single_cron_job \
"${TASK_CRON[$task_name]}" \
"${TASK_SCRIPT[$task_name]}" \
"${TASK_LOG[$task_name]}" \
"$task_name"
done
# 4. 显示当前任务列表
show_current_tasks
log "INFO" "=========================================="
log "INFO" "✅ 定时任务配置完成"
log "INFO" "=========================================="
}
# ========================================
# ✅ 函数:添加单个定时任务(内部函数)
# ========================================
function _add_single_cron_job() {
local cron_expression="$1" local cron_expression="$1"
local script_path="$2" local script_path="$2"
local log_path="$3" local log_path="$3"
...@@ -297,53 +453,19 @@ function show_current_tasks() { ...@@ -297,53 +453,19 @@ function show_current_tasks() {
# ======================================== # ========================================
# ✅ 函数:主函数 # ✅ 函数:主函数
# 用途:供直接调用脚本时使用,内部调用 add_crontab_job 入口函数
# ======================================== # ========================================
function main() { function main() {
# 1. 解析命令行参数 # 调用入口函数,传递所有参数
parse_arguments "$@" add_crontab_job "$@"
log "INFO" "=========================================="
log "INFO" "🚀 开始配置定时任务"
log "INFO" "=========================================="
# 2. 执行清理
cleanup_crontab_jobs
# 3. 根据任务状态配置任务
for task_name in "${!TASK_STATUS[@]}"; do
local status="${TASK_STATUS[$task_name]}"
# 跳过冲突任务
if [[ "$status" == "conflict" ]]; then
log "WARN" "⏭️ 任务 $task_name 参数冲突,已跳过"
continue
fi
# 跳过禁用任务
if [[ "$status" == "false" ]]; then
log "INFO" "⏭️ 任务 $task_name 已被禁用,跳过配置"
continue
fi
# 配置启用的任务
add_crontab_job \
"${TASK_CRON[$task_name]}" \
"${TASK_SCRIPT[$task_name]}" \
"${TASK_LOG[$task_name]}" \
"$task_name"
done
# 4. 显示当前任务列表
show_current_tasks
log "INFO" "=========================================="
log "INFO" "✅ 定时任务配置完成"
log "INFO" "=========================================="
} }
# ======================================== # ========================================
# 主函数入口 # 主函数入口
# 说明:只在直接执行脚本时运行 main,被 source 时不自动运行
# ======================================== # ========================================
main "$@" if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
main "$@"
fi
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
# ./auto_clean_deleted_ubains_v3.sh # ./auto_clean_deleted_ubains_v3.sh
# #
# 定时任务示例: # 定时任务示例:
# 0 4 * * * /opt/scripts/auto_clean_deleted_ubains_v3.sh # 0 4 * * * /data/services/scripts/auto_clean_deleted_ubains_v3.sh
#=============================================================================== #===============================================================================
# ================= 配置区域 ================= # ================= 配置区域 =================
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论