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

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

check_and_update_package() {
local package_name="$1"
local target_path="$2"
local package_parent_dir="$3"
local script_dir=$(get_script_dir)
local package_dir=""
log_info "检查更新包: $package_name"
# 优先检查脚本所在目录是否存在对应的目录
if [ -n "$package_parent_dir" ] && [ -d "$script_dir/$package_parent_dir" ]; then
package_dir="$script_dir/$package_parent_dir"
log_info "在脚本目录发现更新包上级目录: $package_dir"
# 检查指定的文件是否存在于该目录中
if [ ! -f "$package_dir/$package_name" ] && [ ! -d "$package_dir/$package_name" ]; then
log_warn "在 $package_dir 目录中未找到 $package_name"
return 1
fi
elif [ -d "$script_dir/$package_name" ]; then
package_dir="$script_dir/$package_name"
log_info "在脚本目录发现更新包: $package_dir"
else
# 如果脚本目录没有,则提示用户输入
echo -n "未在脚本目录找到更新包,请输入新的版本包目录名称: "
read package_dir_input
if [ -n "$package_dir_input" ]; then
# 判断是绝对路径还是相对路径
if [[ "$package_dir_input" == /* ]]; then
package_dir="$package_dir_input"
else
package_dir="$script_dir/$package_dir_input"
fi
fi
fi
# 修正后的逻辑
if [ -n "$package_dir" ] && [ -d "$package_dir" ]; then
log_info "找到更新包目录: $package_dir"
# 检查目录下是否有文件
if [ -n "$(ls -A "$package_dir")" ]; then
if confirm_action "确认更新 $package_name$target_path?"; then
# 检查目标路径是否存在
if [ -e "$target_path" ]; then
# 创建备份目录,按照PRD文档中的格式
local timestamp=$(date +%Y%m%d%H%M%S)
local backup_path="$(dirname "$target_path")/backup-$timestamp"
mkdir -p "$backup_path"
# 根据PRD文档示例,直接移动整个文件
if [ -f "$target_path" ]; then
# 如果目标路径是文件,则备份该文件
mv "$target_path" "$backup_path/"
log_info "已备份原文件到: $backup_path"
else
# 如果目标路径是目录,则备份整个目录
if [ -d "$target_path" ]; then
mv "$target_path" "$backup_path/"
log_info "已备份原目录到: $backup_path"
fi
fi
else
# 目标路径不存在,确保父目录存在
mkdir -p "$(dirname "$target_path")"
fi
# 正确处理目录更新
if [ -d "$package_dir/$package_name" ]; then
# 如果是目录,复制整个目录
rm -rf "$target_path"
cp -r "$package_dir/$package_name" "$target_path"
log_info "成功更新目录 $package_name 到: $target_path"
else
# 如果是文件,直接复制
mkdir -p "$(dirname "$target_path")"
cp "$package_dir/$package_name" "$target_path"
log_info "成功更新文件 $package_name 到: $target_path"
fi
log_info "成功更新 $package_name: $target_path"
else
log_info "取消更新 $package_name"
fi
else
log_warn "更新包目录为空: $package_dir"
return 1
fi
else
log_warn "未找到有效的更新包目录: $package_dir"
return 1
fi
}
\ No newline at end of file
# 常见问题处理脚本操作说明文档
## 概述
本文档旨在指导用户如何使用 [issue_handler.sh]脚本来处理Linux服务器上的常见问题。该脚本支持交互式操作和命令行参数两种使用方式,可以帮助用户快速解决诸如版本包更新、权限修复、配置文件修改等常见问题。
## 脚本功能
该脚本提供以下主要功能:
1. **更新版本包**:支持更新对内后端、对外后端、前台、后台、运维后端和运维前端等版本包
2. **修复文件权限问题**:自动修复常见文件权限问题,包括数据库用户权限、nginx用户权限等
3. **修复配置文件IP地址问题**:批量替换配置文件中的IP地址
4. **系统磁盘问题处理**:清理已删除但未释放的文件、轮转大日志文件
5. **日志导出与压缩**:导出系统日志并压缩为zip文件
6. **服务异常处理**:修复对外后端服务异常掉线问题
7. **NTP服务配置**:修复NTP服务配置或启动问题
8. **端口开放检查**:检查必要端口是否开放
9. **DNS异常修复**:修复服务器DNS配置异常问题
10. **环境数据备份**:打包备份系统环境数据
11. **定时清理任务**:支持通过cron定时清理已删除但未释放的文件
## 系统要求
- Linux操作系统(支持大多数主流发行版)
- Bash shell环境
- root或sudo权限(建议以root权限运行以确保所有操作都能正常执行)
## 脚本安装与准备
1. 确保脚本具有执行权限:
```bash
chmod +x issue_handler.sh
```
2. (可选)将脚本放置在系统PATH路径中,方便全局调用:
```bash
sudo cp issue_handler.sh /usr/local/bin/
```
## 使用方式
### 1. 交互式模式(推荐)
直接运行脚本进入交互式模式:
```bash
sudo ./issue_handler.sh
```
在交互式模式下,用户将看到如下菜单:
```
===========================================
常见问题处理工具
===========================================
1. 更新版本包
1.1 更新预定系统对内后端包
1.2 更新预定系统对外后端包
1.3 更新预定系统前台包
1.4 更新预定系统后台包
1.5 更新运维后端包
1.6 更新运维前端包
2. 修复文件权限问题
2.1 修复普通文件权限
2.2 修复数据库用户权限
2.3 修复nginx用户权限
3. 修复配置文件IP不对问题
4. 修复系统磁盘问题
4.1 清理已删除文件
4.2 轮转日志文件
5. 导出现场日志文件并压缩
6. 修复对外后端服务异常掉线
7. 修复ntp服务配置或启动问题
8. 修复端口开放问题
9. 修复服务器DNS异常问题
10. 打包备份现场环境数据
0. 退出
===========================================
```
按照屏幕提示输入对应数字选择功能即可。
### 2. 命令行模式
脚本也支持通过命令行参数直接执行特定功能:
```bash
sudo ./issue_handler.sh --action <action_name>
```
可用的 `<action_name>` 包括:
- `update_packages`:更新所有版本包
- `fix_permissions`:修复文件权限
- `fix_ip_configs`:修复IP配置
- `clean_deleted_files`:清理已删除文件
- `clean_deleted_files_cron`:定时任务版本的清理已删除文件(无交互)
- `rotate_logs`:轮转日志文件
- `export_logs`:导出日志文件
- `fix_external_service`:修复对外服务异常
- `fix_ntp`:修复NTP配置
- `fix_ports`:检查端口开放情况
- `fix_dns`:修复DNS配置
例如,要修复文件权限问题,可以执行:
```bash
sudo ./issue_handler.sh --action fix_permissions
```
要执行定时清理任务(无交互),可以执行:
```bash
sudo ./issue_handler.sh --action clean_deleted_files_cron
```
## 详细功能说明
### 更新版本包
#### 工作原理
脚本会优先检查脚本所在目录是否存在对应的更新包目录,如果存在则直接使用,否则提示用户输入更新包路径。
#### 操作步骤
1. 运行脚本并选择更新版本包相关选项
2. 脚本会自动检测更新包位置:
- 首先检查脚本所在目录是否存在同名更新包目录
- 如果不存在,提示用户输入更新包所在目录
3. 用户确认后,脚本会:
- 备份原文件/目录内容
- 执行更新操作
- 提供操作结果反馈
#### 注意事项
- 更新包目录应包含需要更新的完整文件结构
- 脚本会自动备份原文件/目录内容,备份文件名带有时间戳
- 如更新失败,脚本会尝试恢复备份文件
- 对于目录类型的更新(如前端、后台包),脚本会:
1. 在目标目录下创建一个备份目录,将index.html和static等文件移进到备份目录
2. 将更新包中的文件复制到目标目录下
### 修复文件权限问题
#### 功能说明
自动修复系统中常见的文件权限问题,包括:
- 启动脚本权限(通常设置为755)
- 配置文件权限(通常设置为644)
- 数据库和nginx相关权限
#### 操作步骤
1. 选择对应的权限修复选项
2. 脚本会自动检测平台类型(新统一平台或标准版平台)
3. 根据平台类型修复对应的文件权限
### 修复配置文件IP地址问题
#### 功能说明
批量替换系统配置文件中的IP地址。
#### 操作步骤
1. 选择"修复配置文件IP不对问题"选项
2. 输入需要替换的旧IP地址
3. 输入新的IP地址
4. 脚本会自动查找并替换所有相关配置文件中的IP地址
### 系统磁盘问题处理
#### 功能说明
包括两个子功能:
1. 清理已删除但未释放的文件
2. 轮转过大的日志文件
#### 操作步骤
1. 选择对应的功能选项
2. 根据提示进行确认操作
3. 脚本会自动执行相关处理
### 日志导出与压缩
#### 功能说明
导出系统中的重要日志文件并压缩为zip文件,便于传输和分析。
#### 操作步骤
1. 选择"导出现场日志文件并压缩"选项
2. 脚本会自动收集日志并生成带时间戳的zip文件
### 服务异常处理
#### 功能说明
修复对外后端服务异常掉线问题。
#### 操作步骤
1. 选择对应选项
2. 根据提示确认是否添加必要的配置项
3. 确认是否启动服务
### NTP服务配置
#### 功能说明
修复NTP服务配置或启动问题。
#### 操作步骤
1. 选择对应选项
2. 根据提示确认是否添加必要的配置项
3. 确认是否重启NTP服务
### 端口开放检查
#### 功能说明
检查系统必要端口是否开放。
#### 操作步骤
1. 选择对应选项
2. 脚本会显示需要开放的端口列表
3. 用户需手动检查并确保端口已正确开放
### DNS异常修复
#### 功能说明
修复服务器DNS配置异常问题。
#### 操作步骤
1. 选择对应选项
2. 脚本会检查DNS配置文件
3. 如未配置推荐的DNS服务器,会提示用户添加
### 环境数据备份
#### 功能说明
打包备份系统环境数据,包括配置文件、日志文件和系统信息。
#### 操作步骤
1. 选择"打包备份现场环境数据"选项(菜单选项10)
2. 脚本会自动检测平台类型
3. 根据平台类型备份相应的配置文件、日志文件和系统信息
4. 生成包含时间戳的tar.gz压缩包
### 定时清理任务
#### 功能说明
支持通过cron定时清理已删除但未释放的文件,适用于自动化运维场景。
#### 操作步骤
1. 通过命令行模式执行:
```bash
sudo ./issue_handler.sh --action clean_deleted_files_cron
```
2. 脚本会自动检测并清理已删除但未释放的文件
3. 无交互过程,适合定时任务执行
## 安全机制
脚本内置多种安全机制确保操作安全:
1. **权限检查**:运行时会提示建议使用root权限
2. **文件备份**:关键文件操作前会自动创建备份
3. **操作确认**:高风险操作前会询问用户确认
4. **错误恢复**:操作失败时会尝试恢复到之前状态
5. **路径验证**:执行操作前会验证目标路径的有效性
6. **日志记录**:所有操作都会记录到日志文件中,便于审计和问题排查
## 故障排除
### 常见问题
1. **脚本无执行权限**
```
chmod +x issue_handler.sh
```
2. **操作被拒绝**
确保以root权限运行脚本
3. **找不到lsof或zip命令**
安装相应的工具包:
```bash
# CentOS/RHEL/Fedora
yum install lsof zip
# Ubuntu/Debian
apt-get install lsof zip
```
### 日志查看
脚本执行过程中会输出详细的操作日志,包括:
- [INFO]:一般信息
- [WARN]:警告信息
- [ERROR]:错误信息
- [DEBUG]:调试信息
日志文件位于脚本同级目录,文件名为`issue_handler.log`。
## 最佳实践
1. **首次使用建议**:建议首次使用时采用交互式模式,熟悉各项功能
2. **定期执行**:可以将常用功能加入定时任务,定期自动执行
3. **备份重要数据**:虽然脚本会自动备份,但仍建议重要操作前手动备份关键数据
4. **关注日志输出**:仔细查看脚本执行过程中的日志信息,及时发现问题
5. **定时清理任务**:可以将`clean_deleted_files_cron`功能加入crontab,实现定时清理:
```bash
# 每天凌晨3点执行清理已删除但未释放的文件
0 3 * * * /bin/bash {脚本所在目录}/issue_handler.sh --action clean_deleted_files_cron
```
## 联系支持
如在使用过程中遇到问题,请联系技术支持团队。
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论