提交 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 @@ ...@@ -45,6 +45,7 @@
- `sudoset`:sudo命令前缀(根据用户权限判断) - `sudoset`:sudo命令前缀(根据用户权限判断)
- `SUDO`:sudo命令(兼容不同函数中的变量名) - `SUDO`:sudo命令(兼容不同函数中的变量名)
- `server_ip`:服务器IP地址(由主脚本传入) - `server_ip`:服务器IP地址(由主脚本传入)
- `auto_java`:自动化脚本路径(由主脚本传入)
## 规范文档 ## 规范文档
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md` - 代码规范: `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() { ...@@ -314,6 +314,13 @@ check_files_upload() {
log "INFO" "服务器IP地址: $server_ip" log "INFO" "服务器IP地址: $server_ip"
fi fi
# auto_java由主脚本传入
if [[ -z "$auto_java" ]]; then
log "WARN" "未传入自动化脚本路径"
else
log "INFO" "自动化脚本路径: $auto_java"
fi
# ------------------- 执行部署文件检测 ------------------- # ------------------- 执行部署文件检测 -------------------
log "INFO" "----------------------------------------" log "INFO" "----------------------------------------"
log "INFO" "步骤1: 检测部署文件是否完整" log "INFO" "步骤1: 检测部署文件是否完整"
......
...@@ -64,6 +64,14 @@ else ...@@ -64,6 +64,14 @@ else
exit 1 exit 1
fi fi
# 导入定时任务设置脚本
if [[ -f "$SCRIPT_DIR/auto_crontab_settings.sh" ]]; then
source "$SCRIPT_DIR/auto_crontab_settings.sh"
else
log "ERROR" "定时任务设置脚本不存在: $SCRIPT_DIR/auto_crontab_settings.sh"
exit 1
fi
#------------------------------检测模块----------------------------------------------------- #------------------------------检测模块-----------------------------------------------------
...@@ -376,118 +384,6 @@ fi ...@@ -376,118 +384,6 @@ fi
} }
log "INFO" "服务器检测完成" log "INFO" "服务器检测完成"
#------------------------------服务器检测-end------------------------------------------------------------------------------------------------------------------------
#todo: 对文件的检测每次部署的时候根据功能,这里检测的文件是要不一样的,这个先记录,不着急实现
#------------------------------部署文件检测-start--------------------------------------------------------------------------------------------------------------------
#==============================================================#
# 函数名: File_detection_java
# 功能: 检测新统一平台系统所需部署目录是否完整存在
# 说明: 本函数用于在部署前校验关键服务目录是否存在
# 若任一目录缺失,将记录错误并终止脚本
# 支持未来根据不同部署模式动态调整检测列表
# 作者: [ubains]
# 日期: $(date +%Y-%m-%d)
#--------------------------------------------------------------#
# 参数: 无
# 返回: 0: 所有文件检测通过
# 1: 存在缺失文件,终止执行
#--------------------------------------------------------------#
# 日志级别:
# INFO: 正常流程
# ERROR: 错误信息
#==============================================================#
function File_detection_java() {
log "INFO" "=================================================================="
log "INFO" "开始检测新统一平台系统部署文件是否完整"
log "INFO" "=================================================================="
# 定义待检测的服务模块及其相对路径(可根据部署模式动态调整)
# 格式: "模块名称:路径"
local services=(
"预定系统-api/java-meeting2.0:/data/services/api/java-meeting/java-meeting2.0"
"预定系统-extapi:/data/services/api/java-meeting/java-meeting-extapi"
"消息调度:/data/services/api/java-meeting/java-message-scheduling"
"MQTT消息:/data/services/api/java-meeting/java-mqtt"
"Quartz定时任务:/data/services/api/java-meeting/java-quartz"
"运维集控服务:/data/services/api/python-cmdb"
"语音转录服务:/data/services/api/python-voice"
"SSO认证服务:/data/services/api/auth/auth-sso-auth"
"SSO网关服务:/data/services/api/auth/auth-sso-gatway"
"SSO系统管理:/data/services/api/auth/auth-sso-system"
"Dubbo-华为云:/data/services/api/dubbo/dubbo-cloudLink"
"Dubbo-钉钉:/data/services/api/dubbo/dubbo-dingding"
"Dubbo-会议控制:/data/services/api/dubbo/dubbo-meeting-control"
"Dubbo-宝利通:/data/services/api/dubbo/dubbo-polycom"
"Dubbo-服务调用:/data/services/api/dubbo/dubbo-serviceCall"
"Dubbo-SMC3.0:/data/services/api/dubbo/dubbo-smc-three"
"Dubbo-SMC2.0:/data/services/api/dubbo/dubbo-smc-two"
"Dubbo-Teams:/data/services/api/dubbo/dubbo-teams"
"Dubbo-腾讯会议:/data/services/api/dubbo/dubbo-tencent-meeting"
"Dubbo-小鱼易连:/data/services/api/dubbo/dubbo-xylink"
"前端-微应用:/data/services/web/pc/pc-vue2-main"
"前端-AI助手:/data/services/web/pc/pc-vue2-ai"
"前端-统一后台:/data/services/web/pc/pc-vue2-backstage"
"前端-编辑器:/data/services/web/pc/pc-vue2-editor"
"前端-预定:/data/services/web/pc/pc-vue2-meetingV2"
"前端-统一平台:/data/services/web/pc/pc-vue2-meetingV3"
"前端-门户:/data/services/web/pc/pc-vue2-platform"
"前端-运维集控:/data/services/web/pc/pc-vue2-moniter"
"前端-语音转录:/data/services/web/pc/pc-vue2-voice"
"前端-预定移动端:/data/services/web/h5/h5-uniapp-meeting"
"前端-运维集控移动端:/data/services/web/h5/h5-uniapp-moniter"
"前端-统一平台移动端:/data/services/web/h5/h5-uniapp-platform"
"全局脚本:/data/services/scripts"
"备份目录:/data/bakup"
"容器目录:/data/dockers"
"日志目录:/data/logs"
"中间件目录:/data/middleware"
"安全认证目录:/data/security"
"文件存储目录:/data/storage"
"第三方配套件目录:/data/third_party"
)
# 统计总数和失败数
local total=${#services[@]}
local failed=0
local missing_dirs=()
log "INFO" "共检测 $total 个服务模块的部署目录..."
# 遍历每个服务进行目录检测
for service in "${services[@]}"; do
# 分割模块名和路径
local module_name="${service%%:*}"
local relative_path="${service#*:}"
local full_path="$auto_java/$relative_path"
log "INFO" "正在检测 [$module_name] => $full_path"
if [[ -d "$full_path" ]]; then
log "INFO" "✅ [$module_name] 目录校验通过"
else
log "ERROR" "❌ [$module_name] 目录不存在: $full_path"
missing_dirs+=("[$module_name] $full_path")
((failed++))
fi
sleep 0.3 # 可选:避免日志刷屏过快
done
# 输出最终检测结果
if [[ $failed -eq 0 ]]; then
log "INFO" "🎉 部署文件检测完成:所有 $total 个目录均存在,检测成功!"
return 0
else
log "ERROR" "⛔ 部署文件检测失败:共 $failed 个目录缺失"
for dir in "${missing_dirs[@]}"; do
log "ERROR" " 缺失: $dir"
done
log "ERROR" "请重新上传缺失文件后,再执行部署脚本。"
exit 1 # 终止脚本
fi
}
#------------------------------部署文件检测-end--------------------------------------------------------------------------------------------------------------------
#创建用户(预定安装需要:该用户与系统启动用户有关) #创建用户(预定安装需要:该用户与系统启动用户有关)
function add_user() function add_user()
{ {
...@@ -2213,266 +2109,6 @@ function cardtable_x86() { ...@@ -2213,266 +2109,6 @@ function cardtable_x86() {
#------------------------------服务安装-end------------------------------------------------------------------------------------------------------------------------ #------------------------------服务安装-end------------------------------------------------------------------------------------------------------------------------
#------------------------------文件上传&更改ip-start------------------------------------------------------------------------------------------------------------------------
#-----------------------------------新统一平台系统--------------------------------------------
function check_files() {
log "INFO" "=================================================================="
log "INFO" "开始检查并部署 data 目录文件"
log "INFO" "=================================================================="
# ------------------- 定义变量 -------------------
local source_dir="./data" # 脚本同级目录下的 data
local target_dir="/data"
# ------------------- 检查目标目录是否已完整存在 -------------------
local -a required_dirs=("bakup" "dockers" "logs" "middleware" "security" "services" "storage" "temp" "third_party")
local all_dirs_exist=true
if [[ -d "$target_dir" ]]; then
log "INFO" "📁 检测到目标目录已存在: $target_dir"
log "INFO" "🔍 检查必需子目录是否完整..."
for dir in "${required_dirs[@]}"; do
if [[ ! -d "$target_dir/$dir" ]]; then
log "WARN" "⚠️ 缺少目录: $target_dir/$dir"
all_dirs_exist=false
else
log "INFO" "✅ 目录就位: $target_dir/$dir"
fi
done
if $all_dirs_exist; then
log "INFO" "🎉 所有必需目录已存在,跳过文件部署"
# 直接执行 IP 替换脚本,传入新的IP值
local replace_script="./replace_ip_interactive.sh"
if [[ -f "$replace_script" && -x "$replace_script" ]]; then
log "INFO" "🔄 正在执行 IP 替换脚本: $replace_script $server_ip"
if "$replace_script" "$server_ip"; then
log "INFO" "✅ IP 替换脚本执行成功"
else
log "ERROR" "⛔ IP 替换脚本执行失败"
return 1
fi
elif [[ -f "$replace_script" ]]; then
log "ERROR" "⛔ 脚本 $replace_script 存在但不可执行,请运行: chmod +x $replace_script"
return 1
else
log "ERROR" "⛔ 脚本 $replace_script 不存在"
return 1
fi
log "INFO" "✅ 文件检查完成,准备进入服务安装阶段..."
sleep 2
return 0
else
log "INFO" "📦 检测到有目录缺失,需要进行文件同步"
fi
else
log "INFO" "📁 目标目录 $target_dir 不存在,需要创建和部署"
all_dirs_exist=false
fi
# ------------------- 如果有任何一个目录不存在,继续执行文件部署逻辑 -------------------
# ------------------- 检查源目录 -------------------
if [[ ! -d "$source_dir" ]]; then
log "ERROR" "⛔ 源目录不存在: $source_dir"
log "INFO" "请确保当前目录下有 'data' 文件夹,且包含所需内容"
return 1
fi
log "INFO" "📁 检测到源目录: $source_dir"
# ------------------- 检查目标目录是否已存在 -------------------
if [[ -d "$target_dir" ]]; then
log "WARN" "⚠️ 目录 $target_dir 已存在,将进行增量同步(保留原数据)"
log "INFO" "📦 正在同步文件: $source_dir/ → $target_dir/"
# 使用 rsync 增量同步(推荐)或 cp -r
if command -v rsync &>/dev/null; then
log "INFO" "🔄 使用 rsync 进行同步..."
# 捕获标准输出和错误输出
if rsync -av "$source_dir/" "$target_dir/" 2>&1 | while read -r line; do
log "INFO" "📄 $line"
done; then
log "INFO" "✅ rsync 同步完成"
else
log "ERROR" "❌ rsync 同步失败"
return 1
fi
else
log "WARN" "⚠️ 系统未安装 rsync,使用 cp 命令进行同步"
log "INFO" "📋 开始复制文件列表..."
local copy_success=true
find "$source_dir" -type f | while read -r file; do
relative_path="${file#$source_dir/}"
target_file="$target_dir/$relative_path"
mkdir -p "$(dirname "$target_file")" 2>/dev/null
if cp -f "$file" "$target_file" 2>/dev/null; then
log "INFO" "✅ 已复制: $relative_path"
else
log "ERROR" "❌ 复制失败: $relative_path"
copy_success=false
fi
done
# 复制空目录
find "$source_dir" -type d | while read -r dir; do
relative_path="${dir#$source_dir/}"
[ -n "$relative_path" ] && mkdir -p "$target_dir/$relative_path" 2>/dev/null
done
if ! $copy_success; then
log "ERROR" "⛔ 文件复制过程中出现错误"
return 1
fi
fi
else
log "INFO" "📁 目标目录 $target_dir 不存在,正在创建并复制..."
mkdir -p "$(dirname "$target_dir")" || {
log "ERROR" "⛔ 无法创建父目录"
return 1
}
log "INFO" "📋 开始复制整个 data 目录..."
# 修复:直接复制到目标位置
if cp -rfv "$source_dir" "$target_dir" 2>&1 | while read -r line; do
log "INFO" "📄 $line"
done; then
log "INFO" "✅ 成功复制 $source_dir$target_dir"
else
log "ERROR" "⛔ 复制失败,请检查权限"
return 1
fi
fi
# ------------------- 再次验证关键目录是否存在 -------------------
log "INFO" "🔍 同步完成后再次验证目录完整性..."
all_dirs_exist=true
for dir in "${required_dirs[@]}"; do
if [[ ! -d "$target_dir/$dir" ]]; then
log "WARN" "🔍 缺少目录: $target_dir/$dir,部署可能不完整"
all_dirs_exist=false
else
log "INFO" "✅ 目录就位: $target_dir/$dir"
fi
done
if ! $all_dirs_exist; then
log "ERROR" "⛔ 文件部署后仍然缺少必需目录,请检查源数据完整性"
return 1
fi
# ------------------- 执行 IP 替换脚本 -------------------
local replace_script="./replace_ip_interactive.sh"
if [[ -f "$replace_script" && -x "$replace_script" ]]; then
log "INFO" "🔄 正在执行 IP 替换脚本: $replace_script"
if "$replace_script"; then
log "INFO" "✅ IP 替换脚本执行成功"
else
log "ERROR" "⛔ IP 替换脚本执行失败"
return 1
fi
elif [[ -f "$replace_script" ]]; then
log "ERROR" "⛔ 脚本 $replace_script 存在但不可执行,请运行: chmod +x $replace_script"
return 1
else
log "ERROR" "⛔ 脚本 $replace_script 不存在"
return 1
fi
log "INFO" "✅ 文件部署完成:$source_dir$target_dir"
log "INFO" "准备进入服务安装阶段..."
sleep 2
return 0
}
#------------------------------文件上传&更改ip-end--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# ========================================
# ✅ 函数:安全添加定时任务(带脚本存在性检查)
# 每 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"
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
}
#------------------------------全局配置-start-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- #------------------------------全局配置-start--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
###服务器检测配置项 ###服务器检测配置项
#mem-check #mem-check
...@@ -2740,7 +2376,6 @@ function deploy_services() { ...@@ -2740,7 +2376,6 @@ function deploy_services() {
check_files_upload check_files_upload
#开放防火墙 #开放防火墙
firewalldjava firewalldjava
check_files
# 安装服务 # 安装服务
docker_x86 docker_x86
# 部署中间件服务(mysql, redis, emqx, fdfs, ngrok, nacos, nginx) # 部署中间件服务(mysql, redis, emqx, fdfs, ngrok, nacos, nginx)
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论