提交 296ae44f authored 作者: PGY's avatar PGY

优化脚本内容,增加异常处理机制

上级 fb2ba9fb
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
| 修复配置文件IP | IP地址修正 | ✅ 已实现 | 批量替换配置文件中的IP | | 修复配置文件IP | IP地址修正 | ✅ 已实现 | 批量替换配置文件中的IP |
| 修复系统磁盘问题 | 清理已删文件 | ✅ 已实现 | 清理已删除但未释放的文件 | | 修复系统磁盘问题 | 清理已删文件 | ✅ 已实现 | 清理已删除但未释放的文件 |
| | 轮转日志文件 | ✅ 已实现 | 处理过大的日志文件 | | | 轮转日志文件 | ✅ 已实现 | 处理过大的日志文件 |
| | system_log表处理 | ❌ 未实现 | 数据库表清理功能 | | | system_log表处理 | ✅ 已实现 | 数据库表清理功能 |
| 导出现场日志 | 日志导出压缩 | ✅ 已实现 | 导出并压缩日志文件 | | 导出现场日志 | 日志导出压缩 | ✅ 已实现 | 导出并压缩日志文件 |
| 修复服务异常 | 对外服务掉线 | ✅ 已实现 | 修复对外后端服务异常 | | 修复服务异常 | 对外服务掉线 | ✅ 已实现 | 修复对外后端服务异常 |
| | NTP服务配置 | ✅ 已实现 | 修复NTP服务配置 | | | NTP服务配置 | ✅ 已实现 | 修复NTP服务配置 |
...@@ -248,6 +248,16 @@ ...@@ -248,6 +248,16 @@
#### 4.2 已删除文件没有释放导致系统爆满 #### 4.2 已删除文件没有释放导致系统爆满
系统中可能存在已删除但仍在被进程占用的文件,这些文件虽然已被删除但仍占用磁盘空间。
##### 解决方法:
1. 通过脚本交互界面选择清理已删除但未释放的文件功能
2. 脚本会列出所有已删除但仍在被进程占用的文件及其进程信息
3. 用户确认后,脚本会强制结束占用这些文件的进程,释放磁盘空间
##### 定时任务版本:
需要自动创建一个定时任务crond,每天凌晨3点执行一次,把已删除但没释放的进程强制结束。 需要自动创建一个定时任务crond,每天凌晨3点执行一次,把已删除但没释放的进程强制结束。
可以通过以下方式实现: 可以通过以下方式实现:
...@@ -261,32 +271,179 @@ ...@@ -261,32 +271,179 @@
0 3 * * * /bin/bash {脚本所在目录}/issue_handler.sh --action clean_deleted_files_cron 0 3 * * * /bin/bash {脚本所在目录}/issue_handler.sh --action clean_deleted_files_cron
``` ```
执行后会: ##### 执行后会:
1. 自动检测系统中已删除但仍在被进程占用的文件 1. 自动检测系统中已删除但仍在被进程占用的文件
2. 显示这些文件及其占用进程的详细信息 2. 显示这些文件及其占用进程的详细信息
3. 强制结束占用这些文件的进程,释放磁盘空间 3. 用户确认后强制结束占用这些文件的进程,释放磁盘空间
4. 显示操作结果统计(成功/失败的进程数)
#### 4.3 日志文件过大导致系统爆满 #### 4.3 日志文件过大导致系统爆满
##### 新统一平台 系统中的日志文件可能会不断增长,占用大量磁盘空间。
##### 涉及的日志文件:
###### 新统一平台
- `/data/services/api/java-meeting/java-meeting2.0/log.out` - `/data/services/api/java-meeting/java-meeting2.0/log.out`
- `/data/services/api/java-meeting/java-meeting-extapi/log.out` - `/data/services/api/java-meeting/java-meeting-extapi/log.out`
- `/data/services/api/python-cmdb/uinfo.log` - `/data/services/api/python-cmdb/uinfo.log`
- `/data/services/api/python-cmdb/uwsgi.log` - `/data/services/api/python-cmdb/uwsgi.log`
##### 标准版平台 ###### 标准版平台
- `/var/www/java/api-java-meeting2.0/log.out` - `/var/www/java/api-java-meeting2.0/log.out`
- `/var/www/java/external-meeting-api/log.out` - `/var/www/java/external-meeting-api/log.out`
##### 解决方法:
1. 通过脚本交互界面选择轮转日志文件功能
2. 脚本会检查上述日志文件的大小
3. 对于超过100MB的日志文件,会提示用户确认是否进行轮转
4. 用户确认后,脚本会执行以下操作:
- 备份当前日志文件
- 创建新的空日志文件
- 尝试通知相关服务重新打开日志文件
- 压缩旧的日志文件以节省空间
##### 执行后会:
1. 检查所有相关日志文件的大小
2. 对超过100MB的日志文件进行轮转操作
3. 压缩旧日志文件以节省磁盘空间
4. 尝试通知相关服务使用新的日志文件
5. 显示操作结果统计(轮转/跳过/错误的文件数)
#### 4.4 数据库system_log表爆满 #### 4.4 数据库system_log表爆满
容器umysql的数据库ubains中有一个表system_log,容易产生爆满问题。 容器umysql的数据库ubains中有一个表system_log,容易产生爆满问题。
解决方法: ##### 解决方法:
1. 磁盘不够时,每天凌晨3点执行一次定时任务,删除system_log表中30天前的数据。
2. 如果系统磁盘空间足够,不删除system_log表,将表的数据备份成另一个表单再创建该表。 1. 磁盘不够时,通过脚本交互界面选择清理system_log表中30天前的数据。
2. 脚本会验证数据库连接和表存在性后,提示用户确认删除操作。
3. 清理完成后,会执行表空间优化操作,回收释放的空间。
##### 执行过程:
1. 自动检查docker环境和umysql容器状态
2. 提示用户输入数据库root密码
3. 验证数据库连接和system_log表存在性
4. 显示当前system_log表记录数
5. 如果记录数超过100万条,提示用户确认删除30天前的数据
6. 执行数据删除操作
7. 执行表空间优化操作
8. 显示删除后的记录数
##### 注意事项:
- 此操作只会删除30天前的历史数据,保留近期数据用于问题排查
- 操作前请确保已备份重要数据
- 删除操作不可逆,请谨慎操作
#### 4.4 磁盘分区调整参考(手动处理)
由于磁盘分区调整属于高风险操作,可能导致数据丢失或系统无法启动,因此脚本不提供自动处理功能。但为了帮助用户手动处理此类问题,脚本提供了详细的操作指南和注意事项。
##### 操作步骤
当安装完 Linux 操作系统,发现磁盘分区大小错误,或者后期使用过程发现 /home 还剩余很多空间,/ 下空间不足,需要将 /home 下空间重新分配给 / 目录下,方法如下:
1. 查看分区空间和格式
```bash
df -hT
cat /etc/os-release
```
2. 备份数据
```bash
cp -rp /home /run/
# 或者备份到其他安全位置
```
3. 卸载 /home 分区
```bash
# 卸载分区时,务必将该分区内容备份到其他分区,否则会丢失该分区的内容!!
umount /home
```
4. 减小/home分区大小(以减少1.6T为例)
```bash
lvreduce -L -1.6T /dev/mapper/uos-home
mkfs.xfs /dev/mapper/uos-home -f
```
5. 重新挂载 /home 分区:
```bash
mount /dev/mapper/uos-home /home/
```
6. 查看剩余空间:
```bash
vgdisplay
```
7. 给/root目录扩容(以增加40G为例)
```bash
lvextend -L +40G /dev/mapper/uos-root
xfs_growfs /dev/mapper/uos-root
```
8. 验证是否成功
```bash
df -h
```
##### 常见问题及解决方案
###### (一)卸载 /home 分区提示:
```bash
umount: /home: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
```
提示无法卸载,则是有进程占用 /home,解决:
1. 有可能你在 /home 目录下,跳出 /home 再执行卸载。
2. 有进程使用 /home ,使用如下命令终止进程,再卸载。
```bash
fuser -m -k /home
```
###### (二)挂载 /home 分区提示:
```bash
[root@rbtnode1 ~]# xfs_growfs /dev/mapper/centos-home
xfs_growfs: /dev/mapper/centos-home is not a mounted XFS filesystem
```
解决:需要格式化 /home ,再挂载。
###### (三)执行resize2fs报错
```bash
resize2fs: Bad magic number in super-block 当尝试打开 /dev/mapper/centos-root 时
找不到有效的文件系统超级块.
```
解决:查看类型,xfs 系统需要 xfs_growfs 执行。
###### (四)不同文件系统的指令
1. ext2/ext3/ext4文件系统,调整命令是resize2fs(增大和减小都支持)
```bash
lvextend -L 120G /dev/mapper/centos-home //增大至120G
lvextend -L +20G /dev/mapper/centos-home //增加20G
lvreduce -L 50G /dev/mapper/centos-home //减小至50G
lvreduce -L -8G /dev/mapper/centos-home //减小8G
resize2fs /dev/mapper/centos-home //执行调整
```
2. xfs文件系统的调整命令是xfs_growfs(只支持增大)
```bash
lvextend -L 120G /dev/mapper/centos-home //增大至120G
lvextend -L +20G /dev/mapper/centos-home //增加20G
xfs_growfs /dev/mapper/centos-home //执行调整
```
### 5. 导出现场日志文件并压缩 ### 5. 导出现场日志文件并压缩
...@@ -304,11 +461,27 @@ ...@@ -304,11 +461,27 @@
#### 标准版平台 #### 标准版平台
**预定服务** **预定服务**
- `/data/services/api/java-meeting/java-meeting2.0/logs` - `/var/www/java/api-java-meeting2.0/logs`
- `/data/services/api/java-meeting/java-meeting-extapi/logs` - `/var/www/java/external-meeting-api/logs`
**运维服务** **运维服务**
- `/data/services/api/python-cmdb/log` - `/var/www/html/log`
#### 执行过程
1. 自动检测当前平台类型(新统一平台或标准版平台)
2. 检查目标磁盘空间是否充足
3. 创建包含日期时间戳的临时备份目录
4. 备份上述指定的日志目录
5. 将所有备份数据打包为zip或tar.gz格式压缩文件
6. 清理临时备份目录,保留最终的压缩包
7. 显示操作结果(成功/失败状态和压缩包位置)
#### 注意事项
- 默认使用脚本所在目录作为工作目录,避免使用/tmp可能存在的空间限制
- 支持zip和tar.gz两种压缩格式,优先使用zip
- 操作前会检查磁盘空间,如果空间不足会提示用户确认
### 6. 修复对外后端服务异常掉线 ### 6. 修复对外后端服务异常掉线
...@@ -332,96 +505,62 @@ cd /data/services/api/java-meeting/java-meeting-extapi/ ...@@ -332,96 +505,62 @@ cd /data/services/api/java-meeting/java-meeting-extapi/
### 7. 修复ntp服务配置或启动问题 ### 7. 修复ntp服务配置或启动问题
需求说明: 需求说明:
1. 配置`/etc/chrony.conf`文件,添加允许所有地址进行同步:`allow all` 1. 检测系统中使用的NTP服务类型(chronyd、ntpd等)
2. 重启chronyd服务。 2. 配置`/etc/chrony.conf`或相应配置文件,添加允许所有地址进行同步:`allow all`
3. 重启相应的NTP服务
### 8. 修复端口开放问题 #### 执行过程
需求说明: 1. 检测系统中存在的NTP服务类型
2. 检查配置文件中是否已包含`allow all`配置项
3. 如果没有,提示用户确认是否添加
4. 检查NTP服务是否正在运行
5. 提示用户确认是否重启NTP服务
6. 尝试重启NTP服务,支持多种服务管理方式:
- 优先尝试systemctl命令
- 失败时尝试service命令
- 支持多种服务名称(chronyd、ntpd、ntp、chrony)
7. 如果系统未安装NTP服务,会根据包管理器类型(yum/apt-get/dnf)提示安装合适的NTP服务
#### 新统一平台 #### 注意事项
1. 检查服务器是否开放了443、1883、8883、123/udp端口,没开放需要开放 - 脚本不会假定系统一定使用特定的NTP服务,会自动检测
- 提供详细的日志信息,明确告知用户当前操作状态和可能的错误原因
- 当所有自动重启方法失败时,会提供具体的手动操作指导
可以通过以下方式检查和开放端口: ### 8. 修复端口开放问题
1. 使用`firewall-cmd``iptables`命令检查端口是否开放
2. 如果端口未开放,使用相应命令开放端口
3. 重启防火墙服务使配置生效
具体的检查命令:
```bash
# 使用firewall-cmd检查端口(CentOS 7及以上)
firewall-cmd --list-all
# 使用iptables检查端口(较老的系统) 需求说明:
iptables -L -n
# 检查端口监听状态 #### 新统一平台
netstat -tuln | grep -E ':(443|1883|8883|123)'
ss -tuln | grep -E ':(443|1883|8883|123)'
```
开放端口的命令: 1. 检查服务器是否开放了443、1883、8883、123/udp端口,没开放需要开放
```bash
# 使用firewall-cmd开放端口
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-port=1883/tcp
firewall-cmd --permanent --add-port=8883/tcp
firewall-cmd --permanent --add-port=123/udp
firewall-cmd --reload
# 使用iptables开放端口
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 1883 -j ACCEPT
iptables -A INPUT -p tcp --dport 8883 -j ACCEPT
iptables -A INPUT -p udp --dport 123 -j ACCEPT
service iptables save
```
#### 标准版平台 #### 标准版平台
1. 检查服务器是否开放了443、1883、8443、8081、123/udp、8883、4443端口,没开放需要开放。 1. 检查服务器是否开放了443、1883、8443、8081、123/udp、8883、4443端口,没开放需要开放。
可以通过类似的方法检查和开放端口: #### 执行过程
1. 使用`firewall-cmd``iptables`命令检查端口是否开放
2. 如果端口未开放,使用相应命令开放端口
3. 重启防火墙服务使配置生效
具体的检查命令: 1. 检测系统使用的防火墙类型(firewalld或iptables)
```bash 2. 检查防火墙服务是否正在运行
# 使用firewall-cmd检查端口(CentOS 7及以上) 3. 如果防火墙服务未运行,提示用户是否启动服务
firewall-cmd --list-all 4. 检查所需端口是否已开放
5. 对于未开放的端口,提示用户确认是否开放
6. 添加端口规则到防火墙配置中
7. 保存防火墙规则,支持多种保存方式:
- 使用service命令保存
- 直接调用iptables-save命令
- 使用发行版特定工具(iptables-persistent、netfilter-persistent)
- 启用防火墙服务开机自启
8. 如果所有自动保存方法失败,会提供具体的手动保存命令建议
# 使用iptables检查端口(较老的系统) #### 注意事项
iptables -L -n
# 检查端口监听状态 - 脚本会先检测防火墙服务是否存在并检查其运行状态,不能假定服务已启用
netstat -tuln | grep -E ':(443|1883|8443|8081|4443)' - 若防火墙服务未运行,会提示用户是否启动服务,并告知不启动可能带来的影响
ss -tuln | grep -E ':(443|1883|8443|8081|4443)' - 提供清晰的状态反馈和后续操作指导,帮助用户理解当前状况
``` - 启用防火墙服务开机自启,防止系统重启后规则丢失
开放端口的命令:
```bash
# 使用firewall-cmd开放端口
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-port=1883/tcp
firewall-cmd --permanent --add-port=8443/tcp
firewall-cmd --permanent --add-port=8081/tcp
firewall-cmd --permanent --add-port=4443/tcp
firewall-cmd --permanent --add-port=8883/tcp
firewall-cmd --permanent --add-port=123/udp
firewall-cmd --reload
# 使用iptables开放端口
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 1883 -j ACCEPT
iptables -A INPUT -p tcp --dport 8443 -j ACCEPT
iptables -A INPUT -p tcp --dport 8081 -j ACCEPT
iptables -A INPUT -p tcp --dport 4443 -j ACCEPT
iptables -A INPUT -p tcp --dport 8883 -j ACCEPT
iptables -A INPUT -p udp --dport 123 -j ACCEPT
service iptables save
```
### 9. 打包备份现场环境数据 ### 9. 打包备份现场环境数据
...@@ -498,4 +637,23 @@ service iptables save ...@@ -498,4 +637,23 @@ service iptables save
需求说明: 需求说明:
检查网卡配置文件,是否配置了默认的DNS服务器地址:114.114.114.114或8.8.8.8。 检查网卡配置文件,是否配置了默认的DNS服务器地址:114.114.114.114或8.8.8.8。
没配置需要进行配置,再访问外部服务:华为云地址、腾讯云地址、阿里云地址。 没配置需要进行配置,再访问外部服务:华为云地址、腾讯云地址、阿里云地址。
\ No newline at end of file
#### 执行过程
1. 检测系统使用的网络管理器类型(NetworkManager、network、systemd-networkd等)
2. 检查`/etc/resolv.conf`文件中是否已配置推荐的DNS服务器
3. 如果没有配置,会提示用户确认是否添加
4. 添加前会备份原配置文件
5. 添加所有推荐的DNS服务器(114.114.114.114 和 8.8.8.8)
6. 验证配置是否成功写入
7. 提供网络服务重启策略,支持多种Linux发行版的服务管理命令(systemctl/service)
8. 用户确认后重启网络服务使配置生效
9. 重启网络服务后进行网络连接测试,验证配置有效性
#### 注意事项
- 修改DNS配置前会创建带时间戳的备份文件,确保可回滚
- 添加DNS服务器前会检查是否已存在,避免重复配置
- 当自动处理失败时,会提供具体的手动操作指导
- 会根据检测到的网络管理器类型选择相应的服务管理方式
#!/bin/bash #!/bin/bash
# 常见问题处理脚本 # 常见问题处理脚本
# 根据PRD_问题处理文档.md中描述的问题和解决方案,提供自动化处理功能 # 根据PRD_问题处理文档.md中描述的问题和解决方案,提供自动化处理功能
...@@ -8,6 +8,8 @@ RED='\033[0;31m' ...@@ -8,6 +8,8 @@ RED='\033[0;31m'
GREEN='\033[0;32m' GREEN='\033[0;32m'
YELLOW='\033[1;33m' YELLOW='\033[1;33m'
BLUE='\033[0;34m' BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color NC='\033[0m' # No Color
# 日志文件路径 # 日志文件路径
...@@ -38,6 +40,21 @@ log_debug() { ...@@ -38,6 +40,21 @@ log_debug() {
echo "$message" >> "$LOG_FILE" echo "$message" >> "$LOG_FILE"
} }
# 显示操作完成摘要
show_operation_summary() {
local operation_name="$1"
local status="$2"
echo
echo -e "${CYAN}===========================================${NC}"
echo -e "${CYAN}操作完成摘要${NC}"
echo -e "${CYAN}===========================================${NC}"
echo -e "操作名称: ${PURPLE}${operation_name}${NC}"
echo -e "操作状态: $status"
echo -e "${CYAN}===========================================${NC}"
echo
}
# 检测平台类型 # 检测平台类型
detect_platform() { detect_platform() {
if [ -d "/data" ]; then if [ -d "/data" ]; then
...@@ -465,49 +482,128 @@ fix_nginx_user() { ...@@ -465,49 +482,128 @@ fix_nginx_user() {
# 重启nginx服务 # 重启nginx服务
if docker exec ujava2 /usr/local/nginx/sbin/nginx -s reload 2>/dev/null; then if docker exec ujava2 /usr/local/nginx/sbin/nginx -s reload 2>/dev/null; then
log_info "已重启ujava2容器中的nginx服务" log_info "ujava2容器中的nginx服务已重启"
else else
log_error "重启ujava2容器中的nginx服务失败" log_error "ujava2容器中的nginx服务重启失败"
return 1
fi fi
else else
log_error "更新ujava2容器中的nginx配置失败" log_error "ujava2容器中的nginx配置文件更新失败"
return 1
fi fi
else else
log_warn "ujava2容器未运行" log_error "ujava2容器未运行,请先启动容器"
return 1
fi fi
else
log_warn "未找到ujava2容器"
fi fi
# 检查upython容器是否存在 # 检查uweb容器是否存在
if docker ps -a --format '{{.Names}}' | grep -q '^upython$'; then if docker ps -a --format '{{.Names}}' | grep -q '^uweb$'; then
# 检查upython容器是否正在运行 # 检查uweb容器是否正在运行
if docker ps --format '{{.Names}}' | grep -q '^upython$'; then if docker ps --format '{{.Names}}' | grep -q '^uweb$'; then
log_info "处理upython容器中的nginx配置" log_info "处理uweb容器中的nginx配置"
# 修改nginx配置文件中的user值为root # 修改nginx配置文件中的user值为root
if docker exec upython sed -i 's/^user.*/user root;/' /usr/local/nginx/conf/nginx.conf 2>/dev/null; then if docker exec uweb sed -i 's/^user.*/user root;/' /usr/local/nginx/conf/nginx.conf 2>/dev/null; then
log_info "已更新upython容器中的nginx用户为root" log_info "已更新uweb容器中的nginx用户为root"
# 重启nginx服务 # 重启nginx服务
if docker exec upython /usr/local/nginx/sbin/nginx -s reload 2>/dev/null; then if docker exec uweb /usr/local/nginx/sbin/nginx -s reload 2>/dev/null; then
log_info "已重启upython容器中的nginx服务" log_info "uweb容器中的nginx服务已重启"
else else
log_error "重启upython容器中的nginx服务失败" log_error "uweb容器中的nginx服务重启失败"
return 1
fi fi
else else
log_error "更新upython容器中的nginx配置失败" log_error "uweb容器中的nginx配置文件更新失败"
return 1
fi fi
else else
log_warn "upython容器未运行" log_error "uweb容器未运行,请先启动容器"
return 1
fi fi
else
log_warn "未找到upython容器"
fi fi
log_info "nginx用户权限修复完成" log_info "nginx用户权限修复完成"
} }
# 清理数据库system_log表中的旧数据
cleanup_system_log_table() {
log_info "开始清理数据库system_log表中的旧数据"
# 检查是否存在docker环境
if ! command -v docker >/dev/null 2>&1; then
log_error "系统中未安装docker,无法执行数据库清理操作"
return 1
fi
# 检查umysql容器是否存在
if ! docker ps -a --format '{{.Names}}' | grep -q '^umysql$'; then
log_error "未找到umysql容器,请确认数据库容器已创建"
return 1
fi
# 检查umysql容器是否正在运行
if ! docker ps --format '{{.Names}}' | grep -q '^umysql$'; then
log_error "umysql容器未运行,请先启动数据库容器"
return 1
fi
echo -n "请输入数据库root密码: "
read -s root_password
echo
if [ -z "$root_password" ]; then
log_warn "未提供数据库密码,跳过数据库清理操作"
return 1
fi
# 检查数据库连接
if ! docker exec umysql mysql -uroot -p"$root_password" -e "SELECT 1 FROM ubains.system_log LIMIT 1;" >/dev/null 2>&1; then
log_error "无法连接到数据库或system_log表不存在"
return 1
fi
# 获取system_log表的记录数和大小
local record_count=$(docker exec umysql mysql -uroot -p"$root_password" -e "SELECT COUNT(*) FROM ubains.system_log;" 2>/dev/null | tail -n 1)
log_info "system_log表当前记录数: $record_count"
# 检查记录数量是否超过阈值(例如100万条)
if [ "$record_count" -gt 1000000 ]; then
log_warn "system_log表记录数超过100万条,建议清理旧数据"
if confirm_action "是否删除30天前的旧数据?"; then
# 删除30天前的数据
local delete_sql="DELETE FROM ubains.system_log WHERE create_time < DATE_SUB(NOW(), INTERVAL 30 DAY);"
if docker exec umysql mysql -uroot -p"$root_password" -e "$delete_sql"; then
log_info "已删除30天前的旧数据"
# 优化表空间
local optimize_sql="OPTIMIZE TABLE ubains.system_log;"
if docker exec umysql mysql -uroot -p"$root_password" -e "$optimize_sql" >/dev/null 2>&1; then
log_info "已优化system_log表空间"
else
log_warn "优化system_log表空间失败"
fi
# 显示删除后的记录数
local new_record_count=$(docker exec umysql mysql -uroot -p"$root_password" -e "SELECT COUNT(*) FROM ubains.system_log;" 2>/dev/null | tail -n 1)
log_info "system_log表删除后记录数: $new_record_count"
else
log_error "删除旧数据失败"
return 1
fi
else
log_info "用户取消清理操作"
fi
else
log_info "system_log表记录数正常,无需清理"
fi
log_info "数据库system_log表清理完成"
}
# 修复配置文件中的IP地址 # 修复配置文件中的IP地址
fix_ip_configurations() { fix_ip_configurations() {
local platform=$1 local platform=$1
...@@ -594,15 +690,35 @@ clean_deleted_files() { ...@@ -594,15 +690,35 @@ clean_deleted_files() {
echo "$result" echo "$result"
if confirm_action "是否强制结束这些进程以释放文件?"; then if confirm_action "是否强制结束这些进程以释放文件?"; then
log_info "用户确认强制结束进程" log_info "用户确认强制结束进程"
log_info "已执行强制结束进程操作" # 自动结束这些进程
log_info "自动结束占用已删除文件的进程"
local pids=$(lsof +L1 | awk 'NR>1 {print $2}' | sort -u)
local success_count=0
local fail_count=0
for pid in $pids; do
if kill -9 "$pid" 2>/dev/null; then
log_info "已结束进程 PID: $pid"
((success_count++))
else
log_warn "无法结束进程 PID: $pid"
((fail_count++))
fi
done
log_info "已完成进程结束操作: 成功 $success_count 个,失败 $fail_count 个"
show_operation_summary "清理已删除文件" "${GREEN}完成${NC} (成功: $success_count, 失败: $fail_count)"
else else
log_info "用户取消强制结束进程操作" log_info "用户取消强制结束进程操作"
show_operation_summary "清理已删除文件" "${YELLOW}已取消${NC}"
fi fi
else else
log_info "未发现已删除但未释放的文件" log_info "未发现已删除但未释放的文件"
show_operation_summary "清理已删除文件" "${GREEN}无需操作${NC}"
fi fi
else else
log_error "系统中未找到lsof命令" log_error "系统中未找到lsof命令"
show_operation_summary "清理已删除文件" "${RED}失败${NC} (缺少lsof命令)"
fi fi
log_info "清理已删除但未释放的文件完成" log_info "清理已删除但未释放的文件完成"
...@@ -662,31 +778,102 @@ rotate_logs() { ...@@ -662,31 +778,102 @@ rotate_logs() {
fi fi
local timestamp=$(date +"%Y%m%d_%H%M%S") local timestamp=$(date +"%Y%m%d_%H%M%S")
local rotated_count=0
local skipped_count=0
local error_count=0
for log_file in "${log_files[@]}"; do for log_file in "${log_files[@]}"; do
if [ -f "$log_file" ]; then if [ -f "$log_file" ]; then
local size=$(stat -c%s "$log_file") # 使用更兼容的方式获取文件大小
local size=""
if command -v stat >/dev/null 2>&1; then
# GNU/Linux 系统
if stat --version 2>&1 | grep -q "GNU"; then
size=$(stat -c%s "$log_file")
# BSD/macOS 系统
else
size=$(stat -f%z "$log_file")
fi
elif command -v wc >/dev/null 2>&1; then
size=$(wc -c < "$log_file" | tr -d ' ')
else
log_warn "无法获取文件大小: $log_file"
((error_count++))
continue
fi
log_info "日志文件 $log_file 大小: $size 字节" log_info "日志文件 $log_file 大小: $size 字节"
if [ "$size" -gt 104857600 ]; then # 100MB if [ "$size" -gt 104857600 ]; then # 100MB
if confirm_action "日志文件 $log_file 超过100MB,是否轮转?"; then if confirm_action "日志文件 $log_file 超过100MB,是否轮转?"; then
log_info "用户确认轮转日志文件: $log_file" log_info "用户确认轮转日志文件: $log_file"
local backup_name="${log_file}.${timestamp}" local backup_name="${log_file}.${timestamp}"
mv "$log_file" "$backup_name"
touch "$log_file" # 检查目标目录是否有足够空间
log_info "已轮转日志文件: $log_file" local dir_space_req=$((size / 1024 / 1024 + 50)) # 额外50MB空间
local dir_path=$(dirname "$log_file")
local dir_space_avail=$(df "$dir_path" | awk 'NR==2 {print $4}')
if [ "$dir_space_avail" -gt "$dir_space_req" ]; then
# 执行轮转操作
if mv "$log_file" "$backup_name"; then
touch "$log_file"
log_info "已轮转日志文件: $log_file"
((rotated_count++))
# 尝试通知相关服务重新打开日志文件
local service_restarted=false
case "$log_file" in
*/java-meeting2.0/log.out)
if command -v systemctl >/dev/null 2>&1 && systemctl list-units | grep -q java-meeting; then
systemctl reload java-meeting2.0 2>/dev/null && service_restarted=true
fi
;;
*/java-meeting-extapi/log.out)
if command -v systemctl >/dev/null 2>&1 && systemctl list-units | grep -q java-meeting-extapi; then
systemctl reload java-meeting-extapi 2>/dev/null && service_restarted=true
fi
;;
esac
if [ "$service_restarted" = true ]; then
log_info "已通知相关服务重新打开日志文件"
else
log_info "请手动重启相关服务以使用新的日志文件"
fi
# 压缩旧日志文件以节省空间
if command -v gzip >/dev/null 2>&1; then
if gzip "$backup_name" 2>/dev/null; then
log_info "已压缩旧日志文件: ${backup_name}.gz"
else
log_warn "压缩旧日志文件失败: $backup_name"
fi
fi
else
log_error "轮转日志文件失败: $log_file"
((error_count++))
fi
else
log_error "磁盘空间不足,无法轮转日志文件: $log_file"
((error_count++))
fi
else else
log_info "用户取消轮转日志文件: $log_file" log_info "用户取消轮转日志文件: $log_file"
((skipped_count++))
fi fi
else else
log_info "日志文件大小正常: $log_file" log_info "日志文件大小正常: $log_file"
((skipped_count++))
fi fi
else else
log_warn "日志文件不存在: $log_file" log_warn "日志文件不存在: $log_file"
((skipped_count++))
fi fi
done done
log_info "轮转日志文件完成" log_info "轮转日志文件完成"
show_operation_summary "轮转日志文件" "${GREEN}完成${NC} (轮转: $rotated_count, 跳过: $skipped_count, 错误: $error_count)"
} }
# 导出并压缩日志文件 # 导出并压缩日志文件
...@@ -695,53 +882,133 @@ export_and_compress_logs() { ...@@ -695,53 +882,133 @@ export_and_compress_logs() {
log_info "开始导出并压缩日志文件,平台类型: $platform" log_info "开始导出并压缩日志文件,平台类型: $platform"
local timestamp=$(date +"%Y%m%d_%H%M%S") # 根据平台类型确定日志文件路径
local temp_dir="/tmp/logs_export_${timestamp}" local log_dirs=()
mkdir -p "$temp_dir"
log_info "创建临时目录: $temp_dir"
if [ "$platform" = "new" ]; then if [ "$platform" = "new" ]; then
local log_dirs=( log_dirs=(
"预定服务:/data/services/api/java-meeting/java-meeting2.0/logs" "/data/services/api/java-meeting/java-meeting2.0/logs"
"预定服务:/data/services/api/java-meeting/java-meeting-extapi/logs" "/data/services/api/java-meeting/java-meeting-extapi/logs"
"运维服务:/data/services/api/python-cmdb/log" "/data/services/api/python-cmdb/log"
) )
else else
local log_dirs=( log_dirs=(
"预定服务:/data/services/api/java-meeting/java-meeting2.0/logs" "/var/www/java/api-java-meeting2.0/logs"
"预定服务:/data/services/api/java-meeting/java-meeting-extapi/logs" "/var/www/java/external-meeting-api/logs"
"运维服务:/data/services/api/python-cmdb/log" "/var/www/html/log"
) )
fi fi
# 复制日志目录 # 创建临时目录用于存放日志文件
for item in "${log_dirs[@]}"; do local timestamp=$(date +"%Y%m%d_%H%M%S")
local service_type=${item%%:*} local temp_dir="/tmp/logs_backup_${timestamp}"
local log_dir=${item#*:}
# 尝试使用脚本所在目录而不是/tmp
local script_dir=$(dirname "$(readlink -f "$0")")
if [ -w "$script_dir" ] && [ -d "$script_dir" ]; then
temp_dir="${script_dir}/logs_backup_${timestamp}"
fi
if mkdir -p "$temp_dir"; then
log_info "创建临时目录: $temp_dir"
else
log_error "无法创建临时目录: $temp_dir"
return 1
fi
# 预估所需空间
local total_size=0
for log_dir in "${log_dirs[@]}"; do
if [ -d "$log_dir" ]; then
local dir_size=$(du -sb "$log_dir" 2>/dev/null | cut -f1)
total_size=$((total_size + dir_size))
fi
done
# 检查磁盘空间
local temp_dir_parent=$(dirname "$temp_dir")
local available_space=$(df "$temp_dir_parent" | awk 'NR==2 {print $4}')
local required_space=$((total_size * 2 / 1024 / 1024)) # 预留2倍空间
if [ "$available_space" -lt "$required_space" ]; then
log_warn "目标目录空间可能不足,所需空间: ${required_space}MB,可用空间: ${available_space}MB"
if ! confirm_action "是否继续执行?"; then
log_info "用户取消操作"
rm -rf "$temp_dir"
return 1
fi
fi
# 复制日志文件到临时目录
local copy_success=true
for log_dir in "${log_dirs[@]}"; do
if [ -d "$log_dir" ]; then if [ -d "$log_dir" ]; then
local dest_dir="$temp_dir/$service_type/$(basename "$log_dir")" local dest_dir="${temp_dir}/${log_dir#/}"
mkdir -p "$(dirname "$dest_dir")" local dest_parent=$(dirname "$dest_dir")
cp -r "$log_dir" "$(dirname "$dest_dir")"
log_info "已导出日志目录: $log_dir" # 创建目标目录结构
if mkdir -p "$dest_parent"; then
if cp -r "$log_dir" "$dest_parent/"; then
log_info "已复制日志目录: $log_dir"
else
log_error "复制日志目录失败: $log_dir"
copy_success=false
fi
else
log_error "创建目标目录失败: $dest_parent"
copy_success=false
fi
else else
log_warn "日志目录不存在: $log_dir" log_warn "日志目录不存在: $log_dir"
fi fi
done done
# 压缩日志 if [ "$copy_success" = true ]; then
local zip_filename="logs_export_${timestamp}.zip" # 压缩日志文件
if command -v zip >/dev/null 2>&1; then local output_file="${temp_dir}.zip"
(cd "$temp_dir" && zip -r "../$zip_filename" .) local compress_success=false
log_info "日志导出并压缩完成: $zip_filename"
# 尝试使用zip压缩
if command -v zip >/dev/null 2>&1; then
if zip -r "$output_file" "$(basename "$temp_dir")" -j "$temp_dir"; then
log_info "已使用zip压缩日志文件: $output_file"
compress_success=true
else
log_warn "zip压缩失败"
fi
else
log_warn "系统中未找到zip命令"
fi
# 如果zip不可用或失败,尝试使用tar.gz
if [ "$compress_success" = false ]; then
output_file="${temp_dir}.tar.gz"
if command -v tar >/dev/null 2>&1; then
if tar -czf "$output_file" -C "$(dirname "$temp_dir")" "$(basename "$temp_dir")"; then
log_info "已使用tar.gz压缩日志文件: $output_file"
compress_success=true
else
log_error "tar.gz压缩失败"
fi
else
log_error "系统中未找到tar命令"
fi
fi
if [ "$compress_success" = true ]; then
# 清理临时目录
rm -rf "$temp_dir"
log_info "日志文件导出并压缩完成: $output_file"
show_operation_summary "导出并压缩日志" "${GREEN}完成${NC} (文件: $output_file)"
else
log_error "压缩失败,日志文件保留在临时目录: $temp_dir"
show_operation_summary "导出并压缩日志" "${RED}失败${NC} (文件保留在: $temp_dir)"
fi
else else
log_error "系统中未找到zip命令,请安装zip工具" log_error "日志文件复制失败,清理临时目录"
rm -rf "$temp_dir"
show_operation_summary "导出并压缩日志" "${RED}失败${NC}"
fi fi
# 清理临时目录
rm -rf "$temp_dir"
log_info "清理临时目录: $temp_dir"
log_info "导出并压缩日志文件完成" log_info "导出并压缩日志文件完成"
} }
...@@ -801,9 +1068,12 @@ fix_ntp_config() { ...@@ -801,9 +1068,12 @@ fix_ntp_config() {
log_info "开始修复ntp服务配置" log_info "开始修复ntp服务配置"
local chrony_conf="/etc/chrony.conf" local chrony_conf="/etc/chrony.conf"
local ntp_conf="/etc/ntp.conf"
local allow_all_line="allow all" local allow_all_line="allow all"
# 检查并配置chrony
if [ -f "$chrony_conf" ]; then if [ -f "$chrony_conf" ]; then
log_info "检测到 chrony 配置文件: $chrony_conf"
if ! grep -q "^$allow_all_line$" "$chrony_conf"; then if ! grep -q "^$allow_all_line$" "$chrony_conf"; then
if confirm_action "/etc/chrony.conf中未找到allow all配置,是否添加?"; then if confirm_action "/etc/chrony.conf中未找到allow all配置,是否添加?"; then
log_info "用户确认添加allow all配置" log_info "用户确认添加allow all配置"
...@@ -816,23 +1086,161 @@ fix_ntp_config() { ...@@ -816,23 +1086,161 @@ fix_ntp_config() {
log_info "/etc/chrony.conf中已包含allow all配置" log_info "/etc/chrony.conf中已包含allow all配置"
fi fi
if confirm_action "是否重启chronyd服务?"; then if confirm_action "是否重启 chrony 服务?"; then
log_info "用户确认重启chronyd服务" log_info "用户确认重启 chrony 服务"
if systemctl restart chronyd; then restart_ntp_service "chrony"
log_info "已重启chronyd服务" else
else log_info "用户取消重启 chrony 服务"
log_error "重启chronyd服务失败,请手动执行 systemctl restart chronyd" fi
fi # 检查并配置ntp
elif [ -f "$ntp_conf" ]; then
log_info "检测到 ntp 配置文件: $ntp_conf"
# NTP 配置通常不需要额外添加 allow all 行,但我们可以检查 restrict 行
log_info "NTP 配置文件位置: $ntp_conf (通常不需要额外配置)"
if confirm_action "是否重启 ntp 服务?"; then
log_info "用户确认重启 ntp 服务"
restart_ntp_service "ntp"
else else
log_info "用户取消重启chronyd服务" log_info "用户取消重启 ntp 服务"
fi fi
else else
log_warn "配置文件不存在: $chrony_conf" log_warn "未找到 NTP 配置文件"
# 尝试安装 NTP 服务
install_and_start_ntp
fi fi
log_info "修复ntp服务配置完成" log_info "修复ntp服务配置完成"
} }
# 重启NTP服务的通用函数
restart_ntp_service() {
local service_name=$1
local service_found=false
log_info "尝试重启 $service_name 服务"
# 检查 systemctl 是否可用
if command -v systemctl >/dev/null 2>&1; then
# 检查服务是否存在
if systemctl list-unit-files | grep -q "^${service_name}.service"; then
systemctl restart "$service_name"
if [ $? -eq 0 ]; then
log_info "已成功重启 $service_name 服务"
service_found=true
else
log_error "重启 $service_name 服务失败"
fi
else
log_warn "systemctl 中未找到 $service_name 服务"
fi
fi
# 如果 systemctl 不可用或服务未找到,尝试 service 命令
if [ "$service_found" = false ]; then
if command -v service >/dev/null 2>&1; then
if service "$service_name" status >/dev/null 2>&1; then
service "$service_name" restart
if [ $? -eq 0 ]; then
log_info "已成功重启 $service_name 服务"
service_found=true
else
log_error "使用 service 命令重启 $service_name 服务失败"
fi
else
log_warn "service 命令中未找到 $service_name 服务或服务未安装"
fi
else
log_error "系统中未找到 service 命令"
fi
fi
# 如果仍未找到服务,尝试其他可能的服务名称
if [ "$service_found" = false ]; then
local alternative_services=("ntpd" "chronyd" "ntp" "chrony")
log_info "尝试查找替代的 NTP 服务: ${alternative_services[*]}"
for alt_service in "${alternative_services[@]}"; do
if systemctl list-unit-files | grep -q "^${alt_service}.service"; then
systemctl restart "$alt_service"
if [ $? -eq 0 ]; then
log_info "已成功重启替代服务 $alt_service"
service_found=true
break
else
log_error "重启替代服务 $alt_service 失败"
fi
elif service "$alt_service" status >/dev/null 2>&1; then
service "$alt_service" restart
if [ $? -eq 0 ]; then
log_info "已成功重启替代服务 $alt_service (使用 service 命令)"
service_found=true
break
else
log_error "重启替代服务 $alt_service 失败 (使用 service 命令)"
fi
fi
done
fi
if [ "$service_found" = false ]; then
log_error "未能找到并重启任何 NTP 服务,请手动检查系统中的 NTP 服务配置"
fi
}
# 安装并启动NTP服务
install_and_start_ntp() {
log_info "尝试安装 NTP 服务"
# 检查包管理器
if command -v yum >/dev/null 2>&1; then
log_info "检测到 yum 包管理器"
# CentOS/RHEL 系统
if confirm_action "是否安装 chrony (适用于 CentOS/RHEL)?"; then
yum install -y chrony
if [ $? -eq 0 ]; then
log_info "成功安装 chrony"
systemctl enable chrony
systemctl start chrony
log_info "已启动 chrony 服务"
else
log_error "安装 chrony 失败"
fi
fi
elif command -v apt-get >/dev/null 2>&1; then
log_info "检测到 apt-get 包管理器"
# Debian/Ubuntu 系统
if confirm_action "是否安装 ntp (适用于 Debian/Ubuntu)?"; then
apt-get update
apt-get install -y ntp
if [ $? -eq 0 ]; then
log_info "成功安装 ntp"
systemctl enable ntp
systemctl start ntp
log_info "已启动 ntp 服务"
else
log_error "安装 ntp 失败"
fi
fi
elif command -v dnf >/dev/null 2>&1; then
log_info "检测到 dnf 包管理器"
# Fedora 系统
if confirm_action "是否安装 chrony (适用于 Fedora)?"; then
dnf install -y chrony
if [ $? -eq 0 ]; then
log_info "成功安装 chrony"
systemctl enable chrony
systemctl start chrony
log_info "已启动 chrony 服务"
else
log_error "安装 chrony 失败"
fi
fi
else
log_warn "未检测到支持的包管理器,无法自动安装 NTP 服务"
fi
}
# 修复端口开放问题 # 修复端口开放问题
fix_port_access() { fix_port_access() {
local platform=$1 local platform=$1
...@@ -849,18 +1257,50 @@ fix_port_access() { ...@@ -849,18 +1257,50 @@ fix_port_access() {
# 检查系统使用的防火墙类型 # 检查系统使用的防火墙类型
local firewall_type="" local firewall_type=""
local firewall_service=""
if command -v firewall-cmd >/dev/null 2>&1; then if command -v firewall-cmd >/dev/null 2>&1; then
firewall_type="firewalld" firewall_type="firewalld"
firewall_service="firewalld"
log_info "检测到 firewalld 防火墙" log_info "检测到 firewalld 防火墙"
elif command -v iptables >/dev/null 2>&1; then elif command -v iptables >/dev/null 2>&1; then
firewall_type="iptables" firewall_type="iptables"
log_info "检测到 iptables 防火墙" # 检查使用的是哪个iptables服务
if systemctl list-unit-files | grep -q '^iptables.service'; then
firewall_service="iptables"
elif systemctl list-unit-files | grep -q '^netfilter-persistent.service'; then
firewall_service="netfilter-persistent"
else
firewall_service="iptables"
fi
log_info "检测到 iptables 防火墙,服务类型: $firewall_service"
else else
log_warn "未检测到支持的防火墙系统" log_warn "未检测到支持的防火墙系统"
log_info "请手动检查并确保以上端口已正确开放" log_info "请手动检查并确保以上端口已正确开放"
return 1 return 1
fi fi
# 检查防火墙服务是否正在运行
local firewall_running=false
if systemctl is-active --quiet "$firewall_service"; then
firewall_running=true
log_info "防火墙服务 $firewall_service 正在运行"
else
log_warn "防火墙服务 $firewall_service 未运行"
if confirm_action "是否启动防火墙服务 $firewall_service?"; then
if systemctl start "$firewall_service" 2>/dev/null; then
log_info "已启动防火墙服务 $firewall_service"
firewall_running=true
else
log_error "启动防火墙服务 $firewall_service 失败"
log_info "将继续尝试添加端口规则,但可能不会生效直到防火墙服务启动"
fi
else
log_info "用户选择不启动防火墙服务"
log_info "将继续尝试添加端口规则,但可能不会生效直到防火墙服务启动"
fi
fi
# 检查端口状态并询问是否需要开放 # 检查端口状态并询问是否需要开放
local ports_to_open=() local ports_to_open=()
for port_proto in "${required_ports[@]}"; do for port_proto in "${required_ports[@]}"; do
...@@ -878,7 +1318,7 @@ fix_port_access() { ...@@ -878,7 +1318,7 @@ fix_port_access() {
fi fi
;; ;;
"iptables") "iptables")
if iptables -L INPUT -nv | grep -q "dpt:${port}"; then if iptables -L INPUT -nv | grep -q "dpt:${port}\|${port}/${proto}"; then
is_open=true is_open=true
fi fi
;; ;;
...@@ -897,6 +1337,8 @@ fix_port_access() { ...@@ -897,6 +1337,8 @@ fix_port_access() {
log_info "需要开放的端口: ${ports_to_open[*]}" log_info "需要开放的端口: ${ports_to_open[*]}"
if confirm_action "是否开放以上端口?"; then if confirm_action "是否开放以上端口?"; then
log_info "用户确认开放端口" log_info "用户确认开放端口"
local failed_operations=0
for port_proto in "${ports_to_open[@]}"; do for port_proto in "${ports_to_open[@]}"; do
local port=${port_proto%/*} local port=${port_proto%/*}
local proto=${port_proto#*/} local proto=${port_proto#*/}
...@@ -907,6 +1349,7 @@ fix_port_access() { ...@@ -907,6 +1349,7 @@ fix_port_access() {
log_info "已添加端口 $port/$proto 到 firewalld 规则" log_info "已添加端口 $port/$proto 到 firewalld 规则"
else else
log_error "添加端口 $port/$proto 到 firewalld 规则失败" log_error "添加端口 $port/$proto 到 firewalld 规则失败"
((failed_operations++))
fi fi
;; ;;
"iptables") "iptables")
...@@ -914,11 +1357,18 @@ fix_port_access() { ...@@ -914,11 +1357,18 @@ fix_port_access() {
log_info "已添加端口 $port/$proto 到 iptables 规则" log_info "已添加端口 $port/$proto 到 iptables 规则"
else else
log_error "添加端口 $port/$proto 到 iptables 规则失败" log_error "添加端口 $port/$proto 到 iptables 规则失败"
((failed_operations++))
fi fi
;; ;;
esac esac
done done
# 如果有失败的操作,提前返回
if [ $failed_operations -gt 0 ]; then
log_error "部分端口添加失败,请检查防火墙配置"
return 1
fi
# 保存并重启防火墙规则 # 保存并重启防火墙规则
case $firewall_type in case $firewall_type in
"firewalld") "firewalld")
...@@ -929,19 +1379,76 @@ fix_port_access() { ...@@ -929,19 +1379,76 @@ fix_port_access() {
fi fi
;; ;;
"iptables") "iptables")
if service iptables save 2>/dev/null; then # 更全面的iptables规则保存策略
log_info "iptables 规则已保存" local save_success=false
else
log_warn "iptables 规则保存失败,尝试使用其他方法" # 方法1: 使用service命令保存
# 在某些系统上可能需要使用 netfilter-persistent if ! $save_success && command -v service >/dev/null 2>&1; then
if command -v netfilter-persistent >/dev/null 2>&1; then if service iptables save 2>/dev/null; then
log_info "iptables 规则已通过 service iptables save 保存"
save_success=true
fi
fi
# 方法2: 直接调用iptables-save
if ! $save_success; then
if command -v iptables-save >/dev/null 2>&1; then
# 检查常见的iptables规则保存位置
local iptables_save_paths=(
"/etc/sysconfig/iptables"
"/etc/iptables/rules.v4"
"/etc/iptables.conf"
)
for save_path in "${iptables_save_paths[@]}"; do
if [ -w "$(dirname "$save_path")" ] || [ -w "$save_path" ]; then
if iptables-save > "$save_path" 2>/dev/null; then
log_info "iptables 规则已保存到 $save_path"
save_success=true
break
fi
fi
done
fi
fi
# 方法3: 使用发行版特定的命令
if ! $save_success; then
# Ubuntu/Debian系统
if command -v iptables-persistent >/dev/null 2>&1; then
if iptables-persistent save 2>/dev/null; then
log_info "iptables 规则已通过 iptables-persistent 保存"
save_success=true
fi
fi
# 使用netfilter-persistent
if ! $save_success && command -v netfilter-persistent >/dev/null 2>&1; then
if netfilter-persistent save 2>/dev/null; then if netfilter-persistent save 2>/dev/null; then
log_info "iptables 规则已通过 netfilter-persistent 保存" log_info "iptables 规则已通过 netfilter-persistent 保存"
else save_success=true
log_error "iptables 规则保存失败" fi
fi
fi
# 方法4: 启用iptables服务以实现开机自启和规则加载
if ! $save_success; then
if systemctl list-unit-files | grep -q '^iptables.service'; then
if systemctl enable iptables 2>/dev/null; then
log_info "已启用 iptables 服务开机自启"
fi fi
fi fi
fi fi
if ! $save_success; then
log_warn "iptables 规则保存失败,重启系统后规则可能会丢失"
log_info "建议手动执行以下命令之一保存规则:"
log_info " sudo iptables-save > /etc/sysconfig/iptables"
log_info " sudo service iptables save"
log_info " sudo netfilter-persistent save"
else
log_info "iptables 规则保存成功"
fi
;; ;;
esac esac
...@@ -963,6 +1470,22 @@ fix_dns_config() { ...@@ -963,6 +1470,22 @@ fix_dns_config() {
local dns_servers=("114.114.114.114" "8.8.8.8") local dns_servers=("114.114.114.114" "8.8.8.8")
local network_config_files=("/etc/resolv.conf") local network_config_files=("/etc/resolv.conf")
# 检查网络管理器类型
local network_manager=""
if command -v nmcli >/dev/null 2>&1; then
network_manager="NetworkManager"
log_info "检测到 NetworkManager 网络管理器"
elif command -v systemctl >/dev/null 2>&1 && systemctl list-unit-files | grep -q '^network.service'; then
network_manager="network"
log_info "检测到 network 服务"
elif command -v systemctl >/dev/null 2>&1 && systemctl list-unit-files | grep -q '^systemd-networkd.service'; then
network_manager="systemd-networkd"
log_info "检测到 systemd-networkd 网络服务"
else
network_manager="none"
log_info "未检测到标准网络管理器"
fi
for config_file in "${network_config_files[@]}"; do for config_file in "${network_config_files[@]}"; do
if [ -f "$config_file" ]; then if [ -f "$config_file" ]; then
local dns_configured=false local dns_configured=false
...@@ -982,14 +1505,104 @@ fix_dns_config() { ...@@ -982,14 +1505,104 @@ fix_dns_config() {
if confirm_action "是否添加推荐的DNS服务器配置?"; then if confirm_action "是否添加推荐的DNS服务器配置?"; then
log_info "用户确认添加DNS服务器配置" log_info "用户确认添加DNS服务器配置"
echo "nameserver ${dns_servers[0]}" >> "$config_file" local added_servers=0
log_info "已添加DNS服务器: ${dns_servers[0]}"
# 备份原配置文件
local timestamp=$(date +%Y%m%d_%H%M%S)
local backup_file="${config_file}.backup_${timestamp}"
cp "$config_file" "$backup_file"
log_info "已备份原配置文件到: $backup_file"
# 添加所有推荐的DNS服务器
for dns in "${dns_servers[@]}"; do
# 检查是否已经存在该DNS服务器(防止重复添加)
if ! grep -q "nameserver $dns" "$config_file"; then
echo "nameserver $dns" >> "$config_file"
log_info "已添加DNS服务器: $dns"
((added_servers++))
else
log_info "DNS服务器 $dns 已存在,跳过添加"
fi
done
if [ $added_servers -gt 0 ]; then
log_info "成功添加 $added_servers 个DNS服务器"
# 检查配置是否成功添加
local verify_success=true
for dns in "${dns_servers[@]}"; do
if ! grep -q "nameserver $dns" "$config_file"; then
log_error "验证失败:DNS服务器 $dns 未成功添加到配置文件"
verify_success=false
fi
done
if [ "$verify_success" = true ]; then
log_info "DNS服务器配置已成功写入 $config_file"
# 根据网络管理器类型决定是否重启网络服务
local restart_network=false
if [ "$network_manager" != "none" ]; then
if confirm_action "是否重启网络服务以应用DNS配置?"; then
restart_network=true
else
log_info "用户选择不重启网络服务,DNS配置将在下次网络服务重启时生效"
fi
else
log_info "未检测到标准网络管理器,无法自动重启网络服务"
fi
if [ "$restart_network" = true ]; then
case $network_manager in
"NetworkManager")
if systemctl restart NetworkManager 2>/dev/null; then
log_info "已成功重启 NetworkManager 服务"
else
log_error "重启 NetworkManager 服务失败"
log_info "请手动执行: systemctl restart NetworkManager"
fi
;;
"network")
if systemctl restart network 2>/dev/null; then
log_info "已成功重启 network 服务"
else
log_error "重启 network 服务失败"
log_info "请手动执行: systemctl restart network"
fi
;;
"systemd-networkd")
if systemctl restart systemd-networkd 2>/dev/null; then
log_info "已成功重启 systemd-networkd 服务"
else
log_error "重启 systemd-networkd 服务失败"
log_info "请手动执行: systemctl restart systemd-networkd"
fi
;;
esac
# 验证网络连接
log_info "正在验证网络连接..."
if ping -c 3 114.114.114.114 >/dev/null 2>&1; then
log_info "网络连接测试成功"
else
log_warn "网络连接测试失败,请检查网络配置"
fi
fi
else
log_error "DNS服务器配置验证失败"
fi
else
log_info "没有添加新的DNS服务器"
fi
else else
log_info "用户取消添加DNS服务器配置" log_info "用户取消添加DNS服务器配置"
fi fi
else
log_info "DNS配置已符合要求"
fi fi
else else
log_warn "DNS配置文件不存在: $config_file" log_warn "DNS配置文件不存在: $config_file"
log_info "请手动创建配置文件或将DNS配置添加到适当的网络配置文件中"
fi fi
done done
...@@ -1141,35 +1754,323 @@ backup_environment_data() { ...@@ -1141,35 +1754,323 @@ backup_environment_data() {
log_info "打包备份现场环境数据完成" log_info "打包备份现场环境数据完成"
} }
# 显示磁盘分区调整参考信息
show_disk_partition_info() {
log_info "显示磁盘分区调整参考信息"
echo
echo "==================== 磁盘分区调整参考 ===================="
echo
echo "注意:磁盘分区调整属于高风险操作,本工具不提供自动处理功能。"
echo "请严格按照以下步骤手动操作,并确保在操作前做好数据备份。"
echo
echo "当安装完 Linux 操作系统,发现磁盘分区大小错误,或者后期使用过程"
echo "发现 /home 还剩余很多空间,/ 下空间不足,需要将 /home 下空间重新"
echo "分配给 / 目录下,方法如下:"
echo
echo "1、查看分区空间和格式"
echo " df -hT"
echo " cat /etc/os-release"
echo
echo "2、备份数据"
echo " cp -rp /home /run/"
echo " # 或者备份到其他安全位置"
echo
echo "3、卸载 /home 分区"
echo " # 卸载分区时,务必将该分区内容备份到其他分区,否则会丢失该分区的内容!!"
echo " umount /home"
echo
echo "4、减小/home分区大小(以减少1.6T为例)"
echo " lvreduce -L -1.6T /dev/mapper/uos-home"
echo " mkfs.xfs /dev/mapper/uos-home -f"
echo
echo "5、重新挂载 /home 分区:"
echo " mount /dev/mapper/uos-home /home/"
echo
echo "6、查看剩余空间:"
echo " vgdisplay"
echo
echo "7、给/root目录扩容(以增加40G为例)"
echo " lvextend -L +40G /dev/mapper/uos-root"
echo " xfs_growfs /dev/mapper/uos-root"
echo
echo "8、验证是否成功"
echo " df -h"
echo
echo "==================== 常见问题及解决方案 ===================="
echo
echo "(一)卸载 /home 分区提示:"
echo "umount: /home: device is busy."
echo "(In some cases useful info about processes that use"
echo "the device is found by lsof(8) or fuser(1))"
echo
echo "提示无法卸载,则是有进程占用 /home,解决:"
echo "1、有可能你在 /home 目录下,跳出 /home 再执行卸载。"
echo "2、有进程使用 /home ,使用如下命令终止进程,再卸载。"
echo " fuser -m -k /home"
echo
echo "(二)挂载 /home 分区提示:"
echo "[root@rbtnode1 ~]# xfs_growfs /dev/mapper/centos-home"
echo "xfs_growfs: /dev/mapper/centos-home is not a mounted XFS filesystem"
echo
echo "解决:需要格式化 /home ,再挂载。"
echo
echo "(三)执行resize2fs报错"
echo "resize2fs: Bad magic number in super-block 当尝试打开 /dev/mapper/centos-root 时"
echo "找不到有效的文件系统超级块."
echo
echo "解决:查看类型,xfs 系统需要 xfs_growfs 执行。"
echo
echo "(四)不同文件系统的指令"
echo "(1)ext2/ext3/ext4文件系统,调整命令是resize2fs(增大和减小都支持)"
echo " lvextend -L 120G /dev/mapper/centos-home //增大至120G"
echo " lvextend -L +20G /dev/mapper/centos-home //增加20G"
echo " lvreduce -L 50G /dev/mapper/centos-home //减小至50G"
echo " lvreduce -L -8G /dev/mapper/centos-home //减小8G"
echo " resize2fs /dev/mapper/centos-home //执行调整"
echo
echo "(2)xfs文件系统的调整命令是xfs_growfs(只支持增大)"
echo " lvextend -L 120G /dev/mapper/centos-home //增大至120G"
echo " lvextend -L +20G /dev/mapper/centos-home //增加20G"
echo " xfs_growfs /dev/mapper/centos-home //执行调整"
echo
echo "========================================================"
echo
log_info "磁盘分区调整参考信息显示完成"
}
# 显示菜单 # 显示菜单
show_menu() { show_menu() {
local platform=$(detect_platform)
local platform_name=""
case "$platform" in
"new")
platform_name="新统一平台"
;;
"standard")
platform_name="标准版平台"
;;
*)
platform_name="未知平台"
;;
esac
clear clear
echo "===========================================" echo -e "${BLUE}===========================================${NC}"
echo " 常见问题处理工具" echo -e "${BLUE} 常见问题处理工具${NC}"
echo "===========================================" echo -e "${BLUE}===========================================${NC}"
echo "1. 更新版本包" echo
echo " 1.1 更新预定系统对内后端包" echo -e "${YELLOW}当前平台类型: $platform_name${NC}"
echo " 1.2 更新预定系统对外后端包" echo
echo " 1.3 更新预定系统前台包" echo -e "${GREEN}主功能菜单:${NC}"
echo " 1.4 更新预定系统后台包" echo " 1. 更新版本包"
echo " 1.5 更新运维后端包" echo " 1.1 更新预定系统对内后端包"
echo " 1.6 更新运维前端包" echo " 1.2 更新预定系统对外后端包"
echo "2. 修复文件权限问题" echo " 1.3 更新预定系统前台包"
echo " 2.1 修复普通文件权限" echo " 1.4 更新预定系统后台包"
echo " 2.2 修复数据库用户权限" echo " 1.5 更新运维后端包"
echo " 2.3 修复nginx用户权限" echo " 1.6 更新运维前端包"
echo "3. 修复配置文件IP不对问题" echo
echo "4. 修复系统磁盘问题" echo " 2. 修复文件权限问题"
echo " 4.1 清理已删除文件" echo " 2.1 修复普通文件权限"
echo " 4.2 轮转日志文件" echo " 2.2 修复数据库用户权限"
echo "5. 导出现场日志文件并压缩" echo " 2.3 修复nginx用户权限"
echo "6. 修复对外后端服务异常掉线" echo
echo "7. 修复ntp服务配置或启动问题" echo " 3. 修复配置文件IP不对问题"
echo "8. 修复端口开放问题" echo
echo "9. 修复服务器DNS异常问题" echo " 4. 修复系统磁盘问题"
echo "10. 打包备份现场环境数据" echo " 4.1 清理已删除文件"
echo "0. 退出" echo " 4.2 轮转日志文件"
echo "===========================================" echo " 4.3 清理数据库system_log表"
echo " 4.4 磁盘分区调整参考(手动处理)"
echo
echo " 5. 导出现场日志文件并压缩"
echo
echo " 6. 修复对外后端服务异常掉线"
echo
echo " 7. 修复ntp服务配置或启动问题"
echo
echo " 8. 修复端口开放问题"
echo
echo " 9. 修复服务器DNS异常问题"
echo
echo " 10. 打包备份现场环境数据"
echo
echo " 0. 退出"
echo
echo -e "${BLUE}===========================================${NC}"
echo
}
# 获取用户输入并验证
get_user_choice() {
local prompt="$1"
local valid_choices="$2"
local choice=""
while true; do
echo -n "$prompt"
read choice
# 如果没有输入并且允许空输入
if [ -z "$choice" ] && [[ "$valid_choices" == *","* ]]; then
echo "" # 返回空字符串表示全选
return
fi
# 检查输入是否有效
if [[ "$valid_choices" == *"$choice"* ]]; then
echo "$choice"
return
else
echo -e "${RED}无效的选择,请重新输入${NC}"
fi
done
}
# 显示子菜单并获取选择
show_submenu() {
local main_choice="$1"
local platform="$2"
local sub_choice=""
case $main_choice in
1)
sub_choice=$(get_user_choice "请选择子操作 [1.1-1.6, 或按回车全选]: " "1.1,1.2,1.3,1.4,1.5,1.6,")
log_info "用户选择子操作: $sub_choice"
case $sub_choice in
1.1)
log_info "执行更新预定系统对内后端包"
update_inner_backend_jar "$platform"
;;
1.2)
log_info "执行更新预定系统对外后端包"
update_external_backend_jar "$platform"
;;
1.3)
log_info "执行更新预定系统前台包"
update_frontend "$platform"
;;
1.4)
log_info "执行更新预定系统后台包"
update_backend "$platform"
;;
1.5)
log_info "执行更新运维后端包"
update_ops_backend "$platform"
;;
1.6)
log_info "执行更新运维前端包"
update_ops_frontend "$platform"
;;
"")
log_info "执行更新所有包"
update_inner_backend_jar "$platform"
update_external_backend_jar "$platform"
update_frontend "$platform"
update_backend "$platform"
update_ops_backend "$platform"
update_ops_frontend "$platform"
;;
*)
log_error "无效的选择: $sub_choice"
;;
esac
;;
2)
sub_choice=$(get_user_choice "请选择子操作 [2.1-2.3, 或按回车全选]: " "2.1,2.2,2.3,")
log_info "用户选择子操作: $sub_choice"
case $sub_choice in
2.1)
log_info "执行修复普通文件权限"
fix_permissions "$platform"
;;
2.2)
log_info "执行修复数据库用户权限"
fix_db_permissions
;;
2.3)
log_info "执行修复nginx用户权限"
fix_nginx_user
;;
"")
log_info "执行修复所有权限问题"
fix_permissions "$platform"
fix_db_permissions
fix_nginx_user
;;
*)
log_error "无效的选择: $sub_choice"
;;
esac
;;
4)
sub_choice=$(get_user_choice "请选择子操作 [4.1-4.4]: " "4.1,4.2,4.3,4.4")
log_info "用户选择子操作: $sub_choice"
case $sub_choice in
4.1)
log_info "执行清理已删除文件"
clean_deleted_files
;;
4.2)
log_info "执行轮转日志文件"
rotate_logs "$platform"
;;
4.3)
log_info "执行清理数据库system_log表"
cleanup_system_log_table
;;
4.4)
log_info "显示磁盘分区调整参考信息"
show_disk_partition_info
;;
*)
log_error "无效的选择: $sub_choice"
;;
esac
;;
*)
# 对于不需要子菜单的选项,直接执行
case $main_choice in
3)
log_info "执行修复配置文件IP不对问题"
fix_ip_configurations "$platform"
;;
5)
log_info "执行导出现场日志文件并压缩"
export_and_compress_logs "$platform"
;;
6)
log_info "执行修复对外后端服务异常掉线"
fix_external_service_disconnect "$platform"
;;
7)
log_info "执行修复ntp服务配置或启动问题"
fix_ntp_config
;;
8)
log_info "执行修复端口开放问题"
fix_port_access "$platform"
;;
9)
log_info "执行修复服务器DNS异常问题"
fix_dns_config
;;
10)
log_info "执行打包备份现场环境数据"
backup_environment_data "$platform"
;;
*)
log_error "无效的选择: $main_choice"
;;
esac
;;
esac
} }
# 交互式模式 # 交互式模式
...@@ -1191,8 +2092,7 @@ interactive_mode() { ...@@ -1191,8 +2092,7 @@ interactive_mode() {
while true; do while true; do
show_menu show_menu
echo -n "请选择操作 [0-9]: " local choice=$(get_user_choice "请选择操作 [0-10]: " "0,1,2,3,4,5,6,7,8,9,10")
read choice
log_info "用户选择: $choice" log_info "用户选择: $choice"
...@@ -1202,141 +2102,13 @@ interactive_mode() { ...@@ -1202,141 +2102,13 @@ interactive_mode() {
log_info "退出程序" log_info "退出程序"
exit 0 exit 0
;; ;;
1)
echo -n "请选择子操作 [1.1-1.6, 或按回车全选]: "
read sub_choice
log_info "用户选择子操作: $sub_choice"
case $sub_choice in
1.1)
log_info "执行更新预定系统对内后端包"
update_inner_backend_jar "$platform"
;;
1.2)
log_info "执行更新预定系统对外后端包"
update_external_backend_jar "$platform"
;;
1.3)
log_info "执行更新预定系统前台包"
update_frontend "$platform"
;;
1.4)
log_info "执行更新预定系统后台包"
update_backend "$platform"
;;
1.5)
log_info "执行更新运维后端包"
update_ops_backend "$platform"
;;
1.6)
log_info "执行更新运维前端包"
update_ops_frontend "$platform"
;;
"")
log_info "执行更新所有包"
update_inner_backend_jar "$platform"
update_external_backend_jar "$platform"
update_frontend "$platform"
update_backend "$platform"
update_ops_backend "$platform"
update_ops_frontend "$platform"
;;
*)
log_error "无效的选择: $sub_choice"
;;
esac
;;
2)
echo -n "请选择子操作 [2.1-2.3, 或按回车全选]: "
read sub_choice
log_info "用户选择子操作: $sub_choice"
case $sub_choice in
2.1)
log_info "执行修复普通文件权限"
fix_permissions "$platform"
;;
2.2)
log_info "执行修复数据库用户权限"
fix_db_permissions
;;
2.3)
log_info "执行修复nginx用户权限"
fix_nginx_user
;;
"")
log_info "执行修复所有权限问题"
fix_permissions "$platform"
fix_db_permissions
fix_nginx_user
;;
*)
log_error "无效的选择: $sub_choice"
;;
esac
;;
3)
log_info "执行修复配置文件IP不对问题"
fix_ip_configurations "$platform"
;;
4)
echo -n "请选择子操作 [4.1-4.2]: "
read sub_choice
log_info "用户选择子操作: $sub_choice"
case $sub_choice in
4.1)
log_info "执行清理已删除文件"
clean_deleted_files
;;
4.2)
log_info "执行轮转日志文件"
rotate_logs "$platform"
;;
"")
log_info "执行清理已删除文件和轮转日志文件"
clean_deleted_files
rotate_logs "$platform"
;;
*)
log_error "无效的选择: $sub_choice"
;;
esac
;;
5)
log_info "执行导出现场日志文件并压缩"
export_and_compress_logs "$platform"
;;
6)
log_info "执行修复对外后端服务异常掉线"
fix_external_service_disconnect "$platform"
;;
7)
log_info "执行修复ntp服务配置或启动问题"
fix_ntp_config
;;
8)
log_info "执行修复端口开放问题"
fix_port_access "$platform"
;;
9)
log_info "执行修复服务器DNS异常问题"
fix_dns_config
;;
10)
log_info "执行打包备份现场环境数据"
backup_environment_data "$platform"
;;
*) *)
log_error "无效的选择: $choice" show_submenu "$choice" "$platform"
;; ;;
esac esac
echo echo
echo "按回车键继续..." echo -e "${YELLOW}按回车键继续...${NC}"
read read
done done
} }
......
...@@ -11,20 +11,25 @@ ...@@ -11,20 +11,25 @@
1. **更新版本包**:支持更新对内后端、对外后端、前台、后台、运维后端和运维前端等版本包 1. **更新版本包**:支持更新对内后端、对外后端、前台、后台、运维后端和运维前端等版本包
2. **修复文件权限问题**:自动修复常见文件权限问题,包括数据库用户权限、nginx用户权限等 2. **修复文件权限问题**:自动修复常见文件权限问题,包括数据库用户权限、nginx用户权限等
3. **修复配置文件IP地址问题**:批量替换配置文件中的IP地址 3. **修复配置文件IP地址问题**:批量替换配置文件中的IP地址
4. **系统磁盘问题处理**:清理已删除但未释放的文件、轮转大日志文件 4. **系统磁盘问题处理**:包括四个子功能:
5. **日志导出与压缩**:导出系统日志并压缩为zip文件 - 清理已删除但未释放的文件
- 轮转过大的日志文件
- 清理数据库system_log表中30天前的历史数据
- 磁盘分区调整参考指南(高风险操作,仅提供手动处理步骤)
5. **日志导出与压缩**:导出系统日志并压缩为zip或tar.gz文件
6. **服务异常处理**:修复对外后端服务异常掉线问题 6. **服务异常处理**:修复对外后端服务异常掉线问题
7. **NTP服务配置**:修复NTP服务配置或启动问题 7. **NTP服务配置**:修复NTP服务配置或启动问题
8. **端口开放检查**:检查必要端口是否开放 8. **端口开放检查**:检查并开放必要端口
9. **DNS异常修复**:修复服务器DNS配置异常问题 9. **DNS异常修复**:修复服务器DNS配置异常问题
10. **环境数据备份**:打包备份系统环境数据 10. **环境数据备份**:打包备份系统环境数据,包括配置文件、日志文件和系统信息
11. **定时清理任务**:支持通过cron定时清理已删除但未释放的文件 11. **定时清理任务**:支持通过cron定时清理已删除但未释放的文件
## 系统要求 ## 系统要求
- Linux操作系统(支持大多数主流发行版) - Linux操作系统(支持大多数主流发行版,如CentOS、Ubuntu、Debian等)
- Bash shell环境 - Bash shell环境(大部分Linux系统默认包含)
- root或sudo权限(建议以root权限运行以确保所有操作都能正常执行) - root或sudo权限(强烈建议以root权限运行以确保所有操作都能正常执行)
- 部分功能可能需要额外的系统工具,如lsof、zip等(脚本会自动检测并在需要时提示安装)
## 脚本安装与准备 ## 脚本安装与准备
...@@ -40,48 +45,30 @@ ...@@ -40,48 +45,30 @@
## 使用方式 ## 使用方式
### 1. 交互式模式(推荐) ### 1. 交互式模式(推荐,特别适合非技术人员)
这是最简单的使用方式,只需按照屏幕上的菜单提示逐步操作即可。
直接运行脚本进入交互式模式: 直接运行脚本进入交互式模式:
```bash ```bash
sudo ./issue_handler.sh sudo ./issue_handler.sh
``` ```
在交互式模式下,用户将看到如下菜单: 执行后会出现一个菜单界面,通过输入数字选择对应的功能。例如:
``` - 输入 `1` 可以更新版本包
=========================================== - 输入 `4` 可以处理磁盘相关问题
常见问题处理工具 - 输入 `0` 可以退出脚本
===========================================
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. 退出
===========================================
```
按照屏幕提示输入对应数字选择功能即可。 对于有子菜单的选项(如选项1和4),选择后会显示更详细的子菜单,继续输入对应的数字即可。
### 2. 命令行模式 在整个操作过程中:
- 脚本会在关键步骤提示您确认操作,您可以选择 `y`(是)或 `N`(否)
- 所有操作都会有明确的成功或失败提示
- 操作完成后会显示操作结果摘要
脚本也支持通过命令行参数直接执行特定功能: ### 2. 命令行模式(高级用户使用)
如果您熟悉命令行操作,也可以通过命令行参数直接执行特定功能:
```bash ```bash
sudo ./issue_handler.sh --action <action_name> sudo ./issue_handler.sh --action <action_name>
``` ```
...@@ -109,6 +96,8 @@ sudo ./issue_handler.sh --action fix_permissions ...@@ -109,6 +96,8 @@ sudo ./issue_handler.sh --action fix_permissions
sudo ./issue_handler.sh --action clean_deleted_files_cron sudo ./issue_handler.sh --action clean_deleted_files_cron
``` ```
**注意**:命令行模式适合高级用户或自动化任务,普通用户建议使用交互式模式。
## 详细功能说明 ## 详细功能说明
### 更新版本包 ### 更新版本包
...@@ -161,14 +150,27 @@ sudo ./issue_handler.sh --action clean_deleted_files_cron ...@@ -161,14 +150,27 @@ sudo ./issue_handler.sh --action clean_deleted_files_cron
### 系统磁盘问题处理 ### 系统磁盘问题处理
#### 功能说明 #### 功能说明
包括个子功能: 包括个子功能:
1. 清理已删除但未释放的文件 1. 清理已删除但未释放的文件
2. 轮转过大的日志文件 2. 轮转过大的日志文件
3. 清理数据库system_log表中30天前的历史数据
4. 磁盘分区调整参考指南(高风险操作,仅提供手动处理步骤)
#### 操作步骤 #### 操作步骤
1. 选择对应的功能选项 1. 在主菜单中输入 `4` 并按回车进入系统磁盘问题处理菜单
2. 根据提示进行确认操作 2. 根据需要选择子功能:
3. 脚本会自动执行相关处理 - `4.1` 清理已删除文件:自动检测并清理已删除但仍在被进程占用的文件
- `4.2` 轮转日志文件:检查并轮转超过100MB的日志文件
- `4.3` 清理数据库system_log表:清理数据库中30天前的历史数据
- `4.4` 磁盘分区调整参考:显示磁盘分区调整的详细步骤和注意事项
3. 根据屏幕提示进行确认操作
4. 脚本会自动执行相关处理并显示操作结果摘要
#### 注意事项
- 功能4.4(磁盘分区调整)属于高风险操作,脚本仅提供参考指南,不自动执行
- 在执行清理数据库操作前,脚本会要求输入数据库密码并确认操作
- 所有操作都有详细日志记录,可在日志文件中查看完整过程
### 日志导出与压缩 ### 日志导出与压缩
...@@ -245,29 +247,45 @@ sudo ./issue_handler.sh --action clean_deleted_files_cron ...@@ -245,29 +247,45 @@ sudo ./issue_handler.sh --action clean_deleted_files_cron
## 安全机制 ## 安全机制
脚本内置多种安全机制确保操作安全: 为了保护您的系统和数据安全,脚本内置了多种安全机制:
1. **权限检查**:脚本运行时会检查是否具有足够的权限执行操作,如果没有会给出明确提示
2. **文件备份**:在修改任何重要文件之前,脚本会自动创建备份文件,文件名包含操作时间和日期,如 `filename_backup_20231201_120000`
1. **权限检查**:运行时会提示建议使用root权限 3. **操作确认**:对于可能影响系统运行的重要操作(如删除文件、重启服务等),脚本会询问您的确认,您可以选择继续或取消操作
2. **文件备份**:关键文件操作前会自动创建备份
3. **操作确认**:高风险操作前会询问用户确认 4. **错误恢复**:如果某个操作失败,脚本会尝试恢复到操作之前的状态,最大程度保护您的数据
4. **错误恢复**:操作失败时会尝试恢复到之前状态
5. **路径验证**:执行操作前会验证目标路径的有效性 5. **路径验证**:在执行任何文件操作之前,脚本会验证目标路径的有效性,避免误操作
6. **日志记录**:所有操作都会记录到日志文件中,便于审计和问题排查
6. **日志记录**:所有操作都会详细记录到日志文件中,包括操作时间、操作内容、成功或失败状态等,便于后续查询和问题排查
7. **高风险操作保护**:对于特别危险的操作(如磁盘分区调整),脚本不会自动执行,仅提供详细的操作指南和注意事项供您参考
## 故障排除 ## 故障排除
如果您在使用过程中遇到问题,请参考以下解决方案:
### 常见问题 ### 常见问题
1. **脚本无执行权限** 1. **脚本无执行权限**
``` **问题表现**:运行脚本时提示 "Permission denied"
**解决方法**:
```bash
chmod +x issue_handler.sh chmod +x issue_handler.sh
``` ```
2. **操作被拒绝** 2. **操作被拒绝**
确保以root权限运行脚本 **问题表现**:执行操作时提示权限不足或被拒绝
**解决方法**:确保以root权限运行脚本
```bash
sudo ./issue_handler.sh
```
3. **找不到lsof或zip命令** 3. **找不到lsof或zip命令**
安装相应的工具包: **问题表现**:执行某些功能时提示缺少相关命令
**解决方法**:安装相应的工具包:
```bash ```bash
# CentOS/RHEL/Fedora # CentOS/RHEL/Fedora
yum install lsof zip yum install lsof zip
...@@ -276,28 +294,102 @@ sudo ./issue_handler.sh --action clean_deleted_files_cron ...@@ -276,28 +294,102 @@ sudo ./issue_handler.sh --action clean_deleted_files_cron
apt-get install lsof zip apt-get install lsof zip
``` ```
4. **数据库连接失败**
**问题表现**:执行数据库清理操作时提示连接失败
**解决方法**:
- 确认数据库服务正在运行
- 确认输入的数据库密码正确
- 如果问题持续存在,请联系DBA或技术支持
5. **磁盘空间不足**
**问题表现**:执行备份或导出操作时提示空间不足
**解决方法**:
- 清理不必要的文件释放空间
- 选择性执行磁盘清理功能(选项4)
- 联系系统管理员扩展磁盘空间
### 日志查看 ### 日志查看
脚本执行过程中会输出详细的操作日志,包括: 脚本执行过程中会输出详细的操作日志,包括:
- [INFO]:一般信息 - [INFO]:一般信息,表示正常操作步骤
- [WARN]:警告信息 - [WARN]:警告信息,表示需要注意但不影响继续执行的情况
- [ERROR]:错误信息 - [ERROR]:错误信息,表示操作失败或遇到问题
- [DEBUG]:调试信息 - [DEBUG]:调试信息,用于技术排查
日志文件位于脚本同级目录,文件名为`issue_handler.log`。 日志文件位于脚本同级目录,文件名为`issue_handler.log`。
**非技术人员查看日志的方法**:
1. 使用文本编辑器打开 `issue_handler.log` 文件
2. 查看最后几行日志,特别是标记为 [ERROR] 的行
3. 如果需要技术支持,请将最近一段时间的日志内容复制给技术人员
### 需要技术支持时应该提供什么信息
当您需要寻求技术支持时,请尽量提供以下信息:
1. 您执行了什么操作(在菜单中选择了哪个选项)
2. 屏幕上显示了什么错误信息
3. 日志文件 `issue_handler.log` 中的相关内容
4. 您的系统环境(如操作系统版本等)
## 最佳实践 ## 最佳实践
1. **首次使用建议**:建议首次使用时采用交互式模式,熟悉各项功能 为了让您更好地使用该脚本,以下是一些建议:
2. **定期执行**:可以将常用功能加入定时任务,定期自动执行
3. **备份重要数据**:虽然脚本会自动备份,但仍建议重要操作前手动备份关键数据 ### 对于非技术人员的特别建议
4. **关注日志输出**:仔细查看脚本执行过程中的日志信息,及时发现问题
5. **定时清理任务**:可以将`clean_deleted_files_cron`功能加入crontab,实现定时清理: 1. **首次使用必读**:
- 请务必使用交互式模式(直接运行 `sudo ./issue_handler.sh`)
- 仔细阅读屏幕上的每一个提示信息
- 在不确定操作后果时,请咨询有经验的技术人员
2. **操作前的准备工作**:
- 确保您具有root权限(可以使用 `sudo` 命令)
- 确保脚本具有执行权限(可以运行 `chmod +x issue_handler.sh`)
- 如果可能,在重要操作前手动备份关键数据
3. **操作过程中的注意事项**:
- 当看到 `y/N` 提示时,输入 `y` 表示确认操作,输入 `N` 或直接按回车表示取消操作
- 如果不小心选择了错误的选项,大多数操作都可以通过输入 `N` 来取消
- 注意查看操作完成后的结果摘要,确认操作是否成功
4. **操作完成后的检查**:
- 查看操作结果摘要,确认操作状态(成功、失败或取消)
- 如果出现问题,可以查看日志文件 `issue_handler.log` 获取详细信息
- 如果需要技术支持,提供日志文件中的相关信息会有助于问题解决
### 通用建议
1. **定期执行**:可以定期运行磁盘清理、日志轮转等功能,保持系统良好运行状态
2. **备份重要数据**:虽然脚本会自动备份操作涉及的文件,但对于业务数据仍建议单独备份
3. **关注日志输出**:仔细查看脚本执行过程中的日志信息,及时发现问题
4. **定时清理任务**:可以将`clean_deleted_files_cron`功能加入crontab,实现定时清理:
```bash ```bash
# 每天凌晨3点执行清理已删除但未释放的文件 # 每天凌晨3点执行清理已删除但未释放的文件
0 3 * * * /bin/bash {脚本所在目录}/issue_handler.sh --action clean_deleted_files_cron 0 3 * * * /bin/bash {脚本所在目录}/issue_handler.sh --action clean_deleted_files_cron
``` ```
### 常见使用场景示例
1. **系统运行缓慢**
- 可能是磁盘空间不足导致的
- 选择选项 `4` -> `4.1` 清理已删除文件
- 选择选项 `4` -> `4.2` 轮转大日志文件
2. **网络连接异常**
- 选择选项 `9` 修复DNS配置
- 选择选项 `7` 修复NTP服务(时间同步服务)
3. **服务无法访问**
- 选择选项 `8` 检查端口开放情况
- 选择选项 `6` 修复对外服务异常
4. **需要上报问题给技术支持**
- 选择选项 `10` 打包备份现场环境数据
- 将生成的压缩包提供给技术支持人员
## 联系支持 ## 联系支持
如在使用过程中遇到问题,请联系技术支持团队。 如在使用过程中遇到问题,请联系技术支持团队。
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论