提交 252db49a authored 作者: 陈泽健's avatar 陈泽健

feat(scripts): 拆分主脚本模块化定时任务功能

- 创建新的定时任务设置脚本auto_crontab_settings.sh
- 将add_crontab_job函数从主脚本中分离到独立模块
- 在主脚本new_auto.sh中导入并调用定时任务模块
- 添加变量初始化支持sudoset和SUDO变量设置
- 更新文件上传检查脚本以接收auto_java路径参数
- 创建详细的PRD文档说明模块化拆分需求
- 移除主脚本中原有的add_crontab_job函数定义
- 更新脚本调用流程在deploy_services后执行定时任务设置
上级 e0f57343
# 主脚本模块化拆分定时任务部署
## 代码路径
- 需调用代码路径:[自动化部署脚本/x86架构/新统一平台/auto_crontab_settings.sh]
- 主脚本:[自动化部署脚本/x86架构/新统一平台/new_auto.sh]
## 功能需求
### 功能目标
**目标:** 当前主脚本代码量过于庞大,不利于维护,现需将主脚本中的add_crontab_job函数独立出来,通过在主脚本中调用auto_crontab_settings.sh。
### 需求描述
#### 调用逻辑
- 调用方式:
- 在主脚本中source导入auto_crontab_settings.sh,然后调用add_crontab_job函数
```bash
# 在主脚本中导入定时任务设置脚本(已有source导入,无需重复)
# source "$SCRIPT_DIR/auto_crontab_settings.sh"
# 调用定时任务函数
add_crontab_job
```
- 接收脚本执行的返回参数,并使用log函数打印日志
- 0:定时任务设置成功,使用`log "INFO"`打印日志
- 1:定时任务设置失败,使用`log "ERROR"`打印错误日志,使用`return 1`退出当前操作
- 执行时机:
- 在主脚本中deploy_services之后执行;
#### 脚本设计要求
- 主入口函数:
-`auto_crontab_settings.sh`中使用函数`add_crontab_job()`
- 主入口函数负责:
- 调用函数
- 返回部署结果
- log函数依赖:
- 脚本中的log函数与主脚本保持一致
- 在主脚本中先source导入`auto_crontab_settings.sh`,再调用`add_crontab_job`函数
- 变量初始化:
-`add_crontab_job`函数中初始化以下变量:
- `sudoset`:sudo命令前缀(根据用户权限判断)
- `SUDO`:sudo命令(兼容不同函数中的变量名)
## 规范文档
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
- 问题总结: `Docs/PRD/01规范文档/_PRD_问题总结_记录文档.md`
- 方法总结: `Docs/PRD/01规范文档/_PRD_方法总结_记录文档.md`
- 文档规范: `Docs/PRD/01规范文档/_PRD_规范文档_文档规范.md`
- 测试规范: `Docs/PRD/01规范文档/_PRD_规范文档_测试规范.md`
---
\ No newline at end of file
# 主脚本模块化拆分定时任务部署计划执行文档
## 需求来源
- 需求文档:`Docs/PRD/自动化部署脚本/新统一平台/需求文档/_PRD_主脚本模块化拆分定时任务_需求文档.md`
---
## 实现计划
### 1. 代码结构设计
```bash
auto_crontab_settings.sh
└── add_crontab_job() # 已有函数(添加定时任务)
├── 检查cron服务状态
├── 检查脚本文件存在性
├── 检查并添加执行权限
├── 创建日志目录
├── 添加定时任务到crontab
└── 返回结果
```
### 2. 实现步骤
- [ ] 在auto_crontab_settings.sh的add_crontab_job函数中增加变量初始化
- [ ] 在主脚本new_auto.sh中source导入auto_crontab_settings.sh
- [ ] 删除主脚本中的add_crontab_job函数定义
- [ ] 确认调用位置(deploy_services之后)
### 3. 技术要点
#### 3.1 变量初始化
在add_crontab_job函数开头增加:
```bash
# 初始化sudo相关变量
if [[ $(id -u) -ne 0 ]]; then
sudoset="sudo"
SUDO="sudo"
else
sudoset=""
SUDO=""
fi
```
#### 3.2 主脚本调用方式
```bash
# 导入定时任务设置脚本
source "$SCRIPT_DIR/auto_crontab_settings.sh"
# 调用函数
add_crontab_job
```
### 4. 函数位置
- auto_crontab_settings.sh:add_crontab_job函数(已存在,需增加变量初始化)
- new_auto.sh:删除第2108行开始的add_crontab_job函数定义
- new_auto.sh:在已有source导入区域添加auto_crontab_settings.sh导入
### 5. 返回值定义
| 返回值 | 含义 | 处理方式 |
|--------|------|----------|
| 0 | 定时任务设置成功 | 继续执行 |
| 1 | 定时任务设置失败 | log ERROR + return 1 |
### 6. 执行流程
```
deploy_services → add_crontab_job → 继续后续流程
```
---
## 代码修改
### 修改文件
1. `自动化部署脚本/x86架构/新统一平台/auto_crontab_settings.sh` - 增加变量初始化
2. `自动化部署脚本/x86架构/新统一平台/new_auto.sh` - 添加source导入,删除函数定义
---
## 测试计划
- [ ] 测试cron服务未启动场景(自动启动)
- [ ] 测试脚本文件不存在场景
- [ ] 测试脚本无执行权限场景
- [ ] 测试定时任务已存在场景(跳过添加)
- [ ] 测试定时任务添加成功场景
---
## 优化功能回填
> 本章节用于记录实现过程中发现的优化点和改进措施
| 日期 | 优化项 | 状态 | 备注 |
|------|--------|------|------|
| - | - | - | - |
......@@ -45,6 +45,7 @@
- `sudoset`:sudo命令前缀(根据用户权限判断)
- `SUDO`:sudo命令(兼容不同函数中的变量名)
- `server_ip`:服务器IP地址(由主脚本传入)
- `auto_java`:自动化脚本路径(由主脚本传入)
## 规范文档
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
......
# ========================================
# ✅ 函数:安全添加定时任务(带脚本存在性检查)
# 每 3 分钟执行一次 jvm 监控脚本
# ========================================
function add_crontab_job() {
local script_path="/data/services/scripts/ujava2-startup.sh"
local log_path="/var/log/ujava2-cron.log"
local job="*/3 * * * * $script_path >> $log_path 2>&1"
local user=$(whoami)
local crontab_file="/tmp/crontab.tmp.$RANDOM"
# ------------------- 初始化变量 -------------------
# 初始化sudo相关变量
if [[ $(id -u) -ne 0 ]]; then
sudoset="sudo"
SUDO="sudo"
else
sudoset=""
SUDO=""
fi
log "INFO" "🔧 正在添加定时任务: $job"
# 1. 检查 cron 服务是否运行(CentOS/RHEL/Ubuntu 通用)
if ! systemctl is-active --quiet cron 2>/dev/null && ! systemctl is-active --quiet crond 2>/dev/null; then
log "WARN" "⚠️ cron 服务未运行,正在尝试启动..."
if command -v systemctl &>/dev/null; then
sudo systemctl start crond || sudo systemctl start cron
sudo systemctl enable crond || sudo systemctl enable cron
else
service cron start || service crond start
chkconfig cron on || chkconfig crond on
fi
fi
# 2. 检查脚本文件是否存在
if [[ ! -f "$script_path" ]]; then
log "ERROR" "⛔ 脚本文件不存在: $script_path"
log "ERROR" "💡 请确认路径正确,并已部署 ujava2-startup.sh"
return 1
fi
# 3. 检查脚本是否具有可执行权限
if [[ ! -x "$script_path" ]]; then
log "WARN" "⚠️ 脚本无执行权限,正在添加执行权限: chmod +x $script_path"
chmod +x "$script_path"
if [[ $? -ne 0 ]]; then
log "ERROR" "⛔ 无法为 $script_path 添加执行权限,请检查文件权限或使用 root 用户"
return 1
fi
fi
# 4. 确保日志目录存在
local log_dir=$(dirname "$log_path")
if [[ ! -d "$log_dir" ]]; then
log "INFO" "📁 日志目录不存在,正在创建: $log_dir"
mkdir -p "$log_dir"
fi
# 5. 备份当前 crontab
crontab -l > "$crontab_file" 2>/dev/null || {
log "INFO" "📋 当前用户 $user 无现有定时任务,将创建新的"
> "$crontab_file"
}
# 6. 检查是否已存在该任务(避免重复)
if grep -Fq "$script_path" "$crontab_file"; then
log "INFO" "✅ 定时任务已存在,跳过添加"
rm -f "$crontab_file"
return 0
fi
# 7. 追加新任务
echo "$job" >> "$crontab_file"
# 8. 写入 crontab
crontab "$crontab_file"
if [[ $? -eq 0 ]]; then
log "INFO" "🎉 定时任务添加成功"
else
log "ERROR" "⛔ 定时任务添加失败,请检查权限"
rm -f "$crontab_file"
return 1
fi
# 9. 清理临时文件
rm -f "$crontab_file"
# 10. 显示当前任务(过滤空行和注释)
log "INFO" "📋 当前定时任务列表:"
crontab -l | grep -v "^$" | grep -v "^#" | sed 's/^/ → /'
return 0
}
......@@ -314,6 +314,13 @@ check_files_upload() {
log "INFO" "服务器IP地址: $server_ip"
fi
# auto_java由主脚本传入
if [[ -z "$auto_java" ]]; then
log "WARN" "未传入自动化脚本路径"
else
log "INFO" "自动化脚本路径: $auto_java"
fi
# ------------------- 执行部署文件检测 -------------------
log "INFO" "----------------------------------------"
log "INFO" "步骤1: 检测部署文件是否完整"
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论