Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录
切换导航
U
ubains-module-test
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
1
议题
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
郑晓兵
ubains-module-test
Commits
296ae44f
提交
296ae44f
authored
12月 17, 2025
作者:
PGY
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
优化脚本内容,增加异常处理机制
上级
fb2ba9fb
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
1409 行增加
和
387 行删除
+1409
-387
PRD_问题处理文档.md
辅助工具/脚本工具/常见问题处理/PRD_问题处理文档.md
+244
-87
issue_handler.sh
辅助工具/脚本工具/常见问题处理/issue_handler.sh
+1009
-237
操作说明文档.md
辅助工具/脚本工具/常见问题处理/操作说明文档.md
+156
-63
没有找到文件。
辅助工具/脚本工具/常见问题处理/PRD_问题处理文档.md
浏览文件 @
296ae44f
...
...
@@ -29,7 +29,7 @@
| 修复配置文件IP | IP地址修正 | ✅ 已实现 | 批量替换配置文件中的IP |
| 修复系统磁盘问题 | 清理已删文件 | ✅ 已实现 | 清理已删除但未释放的文件 |
| | 轮转日志文件 | ✅ 已实现 | 处理过大的日志文件 |
| | system_log表处理 |
❌ 未
实现 | 数据库表清理功能 |
| | system_log表处理 |
✅ 已
实现 | 数据库表清理功能 |
| 导出现场日志 | 日志导出压缩 | ✅ 已实现 | 导出并压缩日志文件 |
| 修复服务异常 | 对外服务掉线 | ✅ 已实现 | 修复对外后端服务异常 |
| | NTP服务配置 | ✅ 已实现 | 修复NTP服务配置 |
...
...
@@ -248,6 +248,16 @@
#### 4.2 已删除文件没有释放导致系统爆满
系统中可能存在已删除但仍在被进程占用的文件,这些文件虽然已被删除但仍占用磁盘空间。
##### 解决方法:
1.
通过脚本交互界面选择清理已删除但未释放的文件功能
2.
脚本会列出所有已删除但仍在被进程占用的文件及其进程信息
3.
用户确认后,脚本会强制结束占用这些文件的进程,释放磁盘空间
##### 定时任务版本:
需要自动创建一个定时任务crond,每天凌晨3点执行一次,把已删除但没释放的进程强制结束。
可以通过以下方式实现:
...
...
@@ -261,32 +271,179 @@
0 3
*
*
*
/bin/bash
{
脚本所在目录
}
/issue_handler.sh
--action
clean_deleted_files_cron
```
执行后会:
##### 执行后会:
1.
自动检测系统中已删除但仍在被进程占用的文件
2.
显示这些文件及其占用进程的详细信息
3.
强制结束占用这些文件的进程,释放磁盘空间
3.
用户确认后强制结束占用这些文件的进程,释放磁盘空间
4.
显示操作结果统计(成功/失败的进程数)
#### 4.3 日志文件过大导致系统爆满
##### 新统一平台
系统中的日志文件可能会不断增长,占用大量磁盘空间。
##### 涉及的日志文件:
###### 新统一平台
-
`/data/services/api/java-meeting/java-meeting2.0/log.out`
-
`/data/services/api/java-meeting/java-meeting-extapi/log.out`
-
`/data/services/api/python-cmdb/uinfo.log`
-
`/data/services/api/python-cmdb/uwsgi.log`
##### 标准版平台
#####
#
标准版平台
-
`/var/www/java/api-java-meeting2.0/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表爆满
容器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. 导出现场日志文件并压缩
...
...
@@ -304,11 +461,27 @@
#### 标准版平台
**预定服务**
-
`/
data/services/api/java-meeting/
java-meeting2.0/logs`
-
`/
data/services/api/java-meeting/java-meeting-ext
api/logs`
- `/
var/www/java/api-
java-meeting2.0/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. 修复对外后端服务异常掉线
...
...
@@ -332,96 +505,62 @@ cd /data/services/api/java-meeting/java-meeting-extapi/
### 7. 修复ntp服务配置或启动问题
需求说明:
1.
配置
`/etc/chrony.conf`
文件,添加允许所有地址进行同步:
`allow all`
2.
重启chronyd服务。
1.
检测系统中使用的NTP服务类型(chronyd、ntpd等)
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服务,会自动检测
-
提供详细的日志信息,明确告知用户当前操作状态和可能的错误原因
-
当所有自动重启方法失败时,会提供具体的手动操作指导
可以通过以下方式检查和开放端口:
1.
使用
`firewall-cmd`
或
`iptables`
命令检查端口是否开放
2.
如果端口未开放,使用相应命令开放端口
3.
重启防火墙服务使配置生效
具体的检查命令:
```
bash
# 使用firewall-cmd检查端口(CentOS 7及以上)
firewall-cmd
--list-all
### 8. 修复端口开放问题
# 使用iptables检查端口(较老的系统)
iptables
-L
-n
需求说明:
# 检查端口监听状态
netstat
-tuln
|
grep
-E
':(443|1883|8883|123)'
ss
-tuln
|
grep
-E
':(443|1883|8883|123)'
```
#### 新统一平台
开放端口的命令:
```
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、8883、123/udp端口,没开放需要开放
#### 标准版平台
1.
检查服务器是否开放了443、1883、8443、8081、123/udp、8883、4443端口,没开放需要开放。
可以通过类似的方法检查和开放端口:
1.
使用
`firewall-cmd`
或
`iptables`
命令检查端口是否开放
2.
如果端口未开放,使用相应命令开放端口
3.
重启防火墙服务使配置生效
#### 执行过程
具体的检查命令:
```
bash
# 使用firewall-cmd检查端口(CentOS 7及以上)
firewall-cmd
--list-all
1.
检测系统使用的防火墙类型(firewalld或iptables)
2.
检查防火墙服务是否正在运行
3.
如果防火墙服务未运行,提示用户是否启动服务
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. 打包备份现场环境数据
...
...
@@ -498,4 +637,23 @@ service iptables save
需求说明:
检查网卡配置文件,是否配置了默认的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服务器前会检查是否已存在,避免重复配置
-
当自动处理失败时,会提供具体的手动操作指导
-
会根据检测到的网络管理器类型选择相应的服务管理方式
辅助工具/脚本工具/常见问题处理/issue_handler.sh
浏览文件 @
296ae44f
#!/bin/bash
#!/bin/bash
# 常见问题处理脚本
# 根据PRD_问题处理文档.md中描述的问题和解决方案,提供自动化处理功能
...
...
@@ -8,6 +8,8 @@ RED='\033[0;31m'
GREEN
=
'\033[0;32m'
YELLOW
=
'\033[1;33m'
BLUE
=
'\033[0;34m'
PURPLE
=
'\033[0;35m'
CYAN
=
'\033[0;36m'
NC
=
'\033[0m'
# No Color
# 日志文件路径
...
...
@@ -38,6 +40,21 @@ log_debug() {
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
()
{
if
[
-d
"/data"
]
;
then
...
...
@@ -465,49 +482,128 @@ fix_nginx_user() {
# 重启nginx服务
if
docker
exec
ujava2 /usr/local/nginx/sbin/nginx
-s
reload 2>/dev/null
;
then
log_info
"
已重启ujava2容器中的nginx服务
"
log_info
"
ujava2容器中的nginx服务已重启
"
else
log_error
"重启ujava2容器中的nginx服务失败"
log_error
"ujava2容器中的nginx服务重启失败"
return
1
fi
else
log_error
"更新ujava2容器中的nginx配置失败"
log_error
"ujava2容器中的nginx配置文件更新失败"
return
1
fi
else
log_warn
"ujava2容器未运行"
log_error
"ujava2容器未运行,请先启动容器"
return
1
fi
else
log_warn
"未找到ujava2容器"
fi
# 检查u
python
容器是否存在
if
docker ps
-a
--format
'{{.Names}}'
|
grep
-q
'^u
python
$'
;
then
# 检查u
python
容器是否正在运行
if
docker ps
--format
'{{.Names}}'
|
grep
-q
'^u
python
$'
;
then
log_info
"处理u
python
容器中的nginx配置"
# 检查u
web
容器是否存在
if
docker ps
-a
--format
'{{.Names}}'
|
grep
-q
'^u
web
$'
;
then
# 检查u
web
容器是否正在运行
if
docker ps
--format
'{{.Names}}'
|
grep
-q
'^u
web
$'
;
then
log_info
"处理u
web
容器中的nginx配置"
# 修改nginx配置文件中的user值为root
if
docker
exec
u
python
sed
-i
's/^user.*/user root;/'
/usr/local/nginx/conf/nginx.conf 2>/dev/null
;
then
log_info
"已更新u
python
容器中的nginx用户为root"
if
docker
exec
u
web
sed
-i
's/^user.*/user root;/'
/usr/local/nginx/conf/nginx.conf 2>/dev/null
;
then
log_info
"已更新u
web
容器中的nginx用户为root"
# 重启nginx服务
if
docker
exec
u
python
/usr/local/nginx/sbin/nginx
-s
reload 2>/dev/null
;
then
log_info
"
已重启upython容器中的nginx服务
"
if
docker
exec
u
web
/usr/local/nginx/sbin/nginx
-s
reload 2>/dev/null
;
then
log_info
"
uweb容器中的nginx服务已重启
"
else
log_error
"重启upython容器中的nginx服务失败"
log_error
"uweb容器中的nginx服务重启失败"
return
1
fi
else
log_error
"更新upython容器中的nginx配置失败"
log_error
"uweb容器中的nginx配置文件更新失败"
return
1
fi
else
log_warn
"upython容器未运行"
log_error
"uweb容器未运行,请先启动容器"
return
1
fi
else
log_warn
"未找到upython容器"
fi
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地址
fix_ip_configurations
()
{
local
platform
=
$1
...
...
@@ -594,15 +690,35 @@ clean_deleted_files() {
echo
"
$result
"
if
confirm_action
"是否强制结束这些进程以释放文件?"
;
then
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
log_info
"用户取消强制结束进程操作"
show_operation_summary
"清理已删除文件"
"
${
YELLOW
}
已取消
${
NC
}
"
fi
else
log_info
"未发现已删除但未释放的文件"
show_operation_summary
"清理已删除文件"
"
${
GREEN
}
无需操作
${
NC
}
"
fi
else
log_error
"系统中未找到lsof命令"
show_operation_summary
"清理已删除文件"
"
${
RED
}
失败
${
NC
}
(缺少lsof命令)"
fi
log_info
"清理已删除但未释放的文件完成"
...
...
@@ -662,31 +778,102 @@ rotate_logs() {
fi
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
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
字节"
if
[
"
$size
"
-gt
104857600
]
;
then
# 100MB
if
confirm_action
"日志文件
$log_file
超过100MB,是否轮转?"
;
then
log_info
"用户确认轮转日志文件:
$log_file
"
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
log_info
"用户取消轮转日志文件:
$log_file
"
((
skipped_count++
))
fi
else
log_info
"日志文件大小正常:
$log_file
"
((
skipped_count++
))
fi
else
log_warn
"日志文件不存在:
$log_file
"
((
skipped_count++
))
fi
done
log_info
"轮转日志文件完成"
show_operation_summary
"轮转日志文件"
"
${
GREEN
}
完成
${
NC
}
(轮转:
$rotated_count
, 跳过:
$skipped_count
, 错误:
$error_count
)"
}
# 导出并压缩日志文件
...
...
@@ -695,53 +882,133 @@ export_and_compress_logs() {
log_info
"开始导出并压缩日志文件,平台类型:
$platform
"
local
timestamp
=
$(
date
+
"%Y%m%d_%H%M%S"
)
local
temp_dir
=
"/tmp/logs_export_
${
timestamp
}
"
mkdir
-p
"
$temp_dir
"
log_info
"创建临时目录:
$temp_dir
"
# 根据平台类型确定日志文件路径
local
log_dirs
=()
if
[
"
$platform
"
=
"new"
]
;
then
lo
cal
lo
g_dirs
=(
"
预定服务:
/data/services/api/java-meeting/java-meeting2.0/logs"
"
预定服务:
/data/services/api/java-meeting/java-meeting-extapi/logs"
"
运维服务:
/data/services/api/python-cmdb/log"
log_dirs
=(
"/data/services/api/java-meeting/java-meeting2.0/logs"
"/data/services/api/java-meeting/java-meeting-extapi/logs"
"/data/services/api/python-cmdb/log"
)
else
lo
cal
lo
g_dirs
=(
"
预定服务:/data/services/api/java-meeting/
java-meeting2.0/logs"
"
预定服务:/data/services/api/java-meeting/java-meeting-ext
api/logs"
"
运维服务:/data/services/api/python-cmdb
/log"
log_dirs
=(
"
/var/www/java/api-
java-meeting2.0/logs"
"
/var/www/java/external-meeting-
api/logs"
"
/var/www/html
/log"
)
fi
# 复制日志目录
for
item
in
"
${
log_dirs
[@]
}
"
;
do
local
service_type
=
${
item
%%
:
*
}
local
log_dir
=
${
item
#*
:
}
# 创建临时目录用于存放日志文件
local
timestamp
=
$(
date
+
"%Y%m%d_%H%M%S"
)
local
temp_dir
=
"/tmp/logs_backup_
${
timestamp
}
"
# 尝试使用脚本所在目录而不是/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
local
dest_dir
=
"
$temp_dir
/
$service_type
/
$(
basename
"
$log_dir
"
)
"
mkdir
-p
"
$(
dirname
"
$dest_dir
"
)
"
cp
-r
"
$log_dir
"
"
$(
dirname
"
$dest_dir
"
)
"
log_info
"已导出日志目录:
$log_dir
"
local
dest_dir
=
"
${
temp_dir
}
/
${
log_dir
#/
}
"
local
dest_parent
=
$(
dirname
"
$dest_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
log_warn
"日志目录不存在:
$log_dir
"
fi
done
# 压缩日志
local
zip_filename
=
"logs_export_
${
timestamp
}
.zip"
if
command
-v
zip
>
/dev/null 2>&1
;
then
(
cd
"
$temp_dir
"
&&
zip
-r
"../
$zip_filename
"
.
)
log_info
"日志导出并压缩完成:
$zip_filename
"
if
[
"
$copy_success
"
=
true
]
;
then
# 压缩日志文件
local
output_file
=
"
${
temp_dir
}
.zip"
local
compress_success
=
false
# 尝试使用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
log_error
"系统中未找到zip命令,请安装zip工具"
log_error
"日志文件复制失败,清理临时目录"
rm
-rf
"
$temp_dir
"
show_operation_summary
"导出并压缩日志"
"
${
RED
}
失败
${
NC
}
"
fi
# 清理临时目录
rm
-rf
"
$temp_dir
"
log_info
"清理临时目录:
$temp_dir
"
log_info
"导出并压缩日志文件完成"
}
...
...
@@ -801,9 +1068,12 @@ fix_ntp_config() {
log_info
"开始修复ntp服务配置"
local
chrony_conf
=
"/etc/chrony.conf"
local
ntp_conf
=
"/etc/ntp.conf"
local
allow_all_line
=
"allow all"
# 检查并配置chrony
if
[
-f
"
$chrony_conf
"
]
;
then
log_info
"检测到 chrony 配置文件:
$chrony_conf
"
if
!
grep
-q
"^
$allow_all_line
$"
"
$chrony_conf
"
;
then
if
confirm_action
"/etc/chrony.conf中未找到allow all配置,是否添加?"
;
then
log_info
"用户确认添加allow all配置"
...
...
@@ -816,23 +1086,161 @@ fix_ntp_config() {
log_info
"/etc/chrony.conf中已包含allow all配置"
fi
if
confirm_action
"是否重启chronyd服务?"
;
then
log_info
"用户确认重启chronyd服务"
if
systemctl restart chronyd
;
then
log_info
"已重启chronyd服务"
else
log_error
"重启chronyd服务失败,请手动执行 systemctl restart chronyd"
fi
if
confirm_action
"是否重启 chrony 服务?"
;
then
log_info
"用户确认重启 chrony 服务"
restart_ntp_service
"chrony"
else
log_info
"用户取消重启 chrony 服务"
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
log_info
"用户取消重启
chronyd
服务"
log_info
"用户取消重启
ntp
服务"
fi
else
log_warn
"配置文件不存在:
$chrony_conf
"
log_warn
"未找到 NTP 配置文件"
# 尝试安装 NTP 服务
install_and_start_ntp
fi
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
()
{
local
platform
=
$1
...
...
@@ -849,18 +1257,50 @@ fix_port_access() {
# 检查系统使用的防火墙类型
local
firewall_type
=
""
local
firewall_service
=
""
if
command
-v
firewall-cmd
>
/dev/null 2>&1
;
then
firewall_type
=
"firewalld"
firewall_service
=
"firewalld"
log_info
"检测到 firewalld 防火墙"
elif
command
-v
iptables
>
/dev/null 2>&1
;
then
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
log_warn
"未检测到支持的防火墙系统"
log_info
"请手动检查并确保以上端口已正确开放"
return
1
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
=()
for
port_proto
in
"
${
required_ports
[@]
}
"
;
do
...
...
@@ -878,7 +1318,7 @@ fix_port_access() {
fi
;;
"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
fi
;;
...
...
@@ -897,6 +1337,8 @@ fix_port_access() {
log_info
"需要开放的端口:
${
ports_to_open
[*]
}
"
if
confirm_action
"是否开放以上端口?"
;
then
log_info
"用户确认开放端口"
local
failed_operations
=
0
for
port_proto
in
"
${
ports_to_open
[@]
}
"
;
do
local
port
=
${
port_proto
%/*
}
local
proto
=
${
port_proto
#*/
}
...
...
@@ -907,6 +1349,7 @@ fix_port_access() {
log_info
"已添加端口
$port
/
$proto
到 firewalld 规则"
else
log_error
"添加端口
$port
/
$proto
到 firewalld 规则失败"
((
failed_operations++
))
fi
;;
"iptables"
)
...
...
@@ -914,11 +1357,18 @@ fix_port_access() {
log_info
"已添加端口
$port
/
$proto
到 iptables 规则"
else
log_error
"添加端口
$port
/
$proto
到 iptables 规则失败"
((
failed_operations++
))
fi
;;
esac
done
# 如果有失败的操作,提前返回
if
[
$failed_operations
-gt
0
]
;
then
log_error
"部分端口添加失败,请检查防火墙配置"
return
1
fi
# 保存并重启防火墙规则
case
$firewall_type
in
"firewalld"
)
...
...
@@ -929,19 +1379,76 @@ fix_port_access() {
fi
;;
"iptables"
)
if
service iptables save 2>/dev/null
;
then
log_info
"iptables 规则已保存"
else
log_warn
"iptables 规则保存失败,尝试使用其他方法"
# 在某些系统上可能需要使用 netfilter-persistent
if
command
-v
netfilter-persistent
>
/dev/null 2>&1
;
then
# 更全面的iptables规则保存策略
local
save_success
=
false
# 方法1: 使用service命令保存
if
!
$save_success
&&
command
-v
service
>
/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
log_info
"iptables 规则已通过 netfilter-persistent 保存"
else
log_error
"iptables 规则保存失败"
save_success
=
true
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
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
...
...
@@ -963,6 +1470,22 @@ fix_dns_config() {
local
dns_servers
=(
"114.114.114.114"
"8.8.8.8"
)
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
if
[
-f
"
$config_file
"
]
;
then
local
dns_configured
=
false
...
...
@@ -982,14 +1505,104 @@ fix_dns_config() {
if
confirm_action
"是否添加推荐的DNS服务器配置?"
;
then
log_info
"用户确认添加DNS服务器配置"
echo
"nameserver
${
dns_servers
[0]
}
"
>>
"
$config_file
"
log_info
"已添加DNS服务器:
${
dns_servers
[0]
}
"
local
added_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
log_info
"用户取消添加DNS服务器配置"
fi
else
log_info
"DNS配置已符合要求"
fi
else
log_warn
"DNS配置文件不存在:
$config_file
"
log_info
"请手动创建配置文件或将DNS配置添加到适当的网络配置文件中"
fi
done
...
...
@@ -1141,35 +1754,323 @@ backup_environment_data() {
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
()
{
local
platform
=
$(
detect_platform
)
local
platform_name
=
""
case
"
$platform
"
in
"new"
)
platform_name
=
"新统一平台"
;;
"standard"
)
platform_name
=
"标准版平台"
;;
*
)
platform_name
=
"未知平台"
;;
esac
clear
echo
"==========================================="
echo
" 常见问题处理工具"
echo
"==========================================="
echo
"1. 更新版本包"
echo
" 1.1 更新预定系统对内后端包"
echo
" 1.2 更新预定系统对外后端包"
echo
" 1.3 更新预定系统前台包"
echo
" 1.4 更新预定系统后台包"
echo
" 1.5 更新运维后端包"
echo
" 1.6 更新运维前端包"
echo
"2. 修复文件权限问题"
echo
" 2.1 修复普通文件权限"
echo
" 2.2 修复数据库用户权限"
echo
" 2.3 修复nginx用户权限"
echo
"3. 修复配置文件IP不对问题"
echo
"4. 修复系统磁盘问题"
echo
" 4.1 清理已删除文件"
echo
" 4.2 轮转日志文件"
echo
"5. 导出现场日志文件并压缩"
echo
"6. 修复对外后端服务异常掉线"
echo
"7. 修复ntp服务配置或启动问题"
echo
"8. 修复端口开放问题"
echo
"9. 修复服务器DNS异常问题"
echo
"10. 打包备份现场环境数据"
echo
"0. 退出"
echo
"==========================================="
echo
-e
"
${
BLUE
}
===========================================
${
NC
}
"
echo
-e
"
${
BLUE
}
常见问题处理工具
${
NC
}
"
echo
-e
"
${
BLUE
}
===========================================
${
NC
}
"
echo
echo
-e
"
${
YELLOW
}
当前平台类型:
$platform_name
${
NC
}
"
echo
echo
-e
"
${
GREEN
}
主功能菜单:
${
NC
}
"
echo
" 1. 更新版本包"
echo
" 1.1 更新预定系统对内后端包"
echo
" 1.2 更新预定系统对外后端包"
echo
" 1.3 更新预定系统前台包"
echo
" 1.4 更新预定系统后台包"
echo
" 1.5 更新运维后端包"
echo
" 1.6 更新运维前端包"
echo
echo
" 2. 修复文件权限问题"
echo
" 2.1 修复普通文件权限"
echo
" 2.2 修复数据库用户权限"
echo
" 2.3 修复nginx用户权限"
echo
echo
" 3. 修复配置文件IP不对问题"
echo
echo
" 4. 修复系统磁盘问题"
echo
" 4.1 清理已删除文件"
echo
" 4.2 轮转日志文件"
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() {
while
true
;
do
show_menu
echo
-n
"请选择操作 [0-9]: "
read
choice
local
choice
=
$(
get_user_choice
"请选择操作 [0-10]: "
"0,1,2,3,4,5,6,7,8,9,10"
)
log_info
"用户选择:
$choice
"
...
...
@@ -1202,141 +2102,13 @@ interactive_mode() {
log_info
"退出程序"
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
echo
echo
"按回车键继续...
"
echo
-e
"
${
YELLOW
}
按回车键继续...
${
NC
}
"
read
done
}
...
...
辅助工具/脚本工具/常见问题处理/操作说明文档.md
浏览文件 @
296ae44f
...
...
@@ -11,20 +11,25 @@
1.
**更新版本包**
:支持更新对内后端、对外后端、前台、后台、运维后端和运维前端等版本包
2.
**修复文件权限问题**
:自动修复常见文件权限问题,包括数据库用户权限、nginx用户权限等
3.
**修复配置文件IP地址问题**
:批量替换配置文件中的IP地址
4.
**系统磁盘问题处理**
:清理已删除但未释放的文件、轮转大日志文件
5.
**日志导出与压缩**
:导出系统日志并压缩为zip文件
4.
**系统磁盘问题处理**
:包括四个子功能:
-
清理已删除但未释放的文件
-
轮转过大的日志文件
-
清理数据库system_log表中30天前的历史数据
-
磁盘分区调整参考指南(高风险操作,仅提供手动处理步骤)
5.
**日志导出与压缩**
:导出系统日志并压缩为zip或tar.gz文件
6.
**服务异常处理**
:修复对外后端服务异常掉线问题
7.
**NTP服务配置**
:修复NTP服务配置或启动问题
8.
**端口开放检查**
:检查
必要端口是否开放
8.
**端口开放检查**
:检查
并开放必要端口
9.
**DNS异常修复**
:修复服务器DNS配置异常问题
10.
**环境数据备份**
:打包备份系统环境数据
10.
**环境数据备份**
:打包备份系统环境数据
,包括配置文件、日志文件和系统信息
11.
**定时清理任务**
:支持通过cron定时清理已删除但未释放的文件
## 系统要求
-
Linux操作系统(支持大多数主流发行版)
-
Bash shell环境
-
root或sudo权限(建议以root权限运行以确保所有操作都能正常执行)
-
Linux操作系统(支持大多数主流发行版,如CentOS、Ubuntu、Debian等)
-
Bash shell环境(大部分Linux系统默认包含)
-
root或sudo权限(强烈建议以root权限运行以确保所有操作都能正常执行)
-
部分功能可能需要额外的系统工具,如lsof、zip等(脚本会自动检测并在需要时提示安装)
## 脚本安装与准备
...
...
@@ -40,48 +45,30 @@
## 使用方式
### 1. 交互式模式(推荐)
### 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. 退出
===========================================
```
执行后会出现一个菜单界面,通过输入数字选择对应的功能。例如:
- 输入 `1` 可以更新版本包
- 输入 `4` 可以处理磁盘相关问题
- 输入 `0` 可以退出脚本
按照屏幕提示输入对应数字选择功能
即可。
对于有子菜单的选项(如选项1和4),选择后会显示更详细的子菜单,继续输入对应的数字
即可。
### 2. 命令行模式
在整个操作过程中:
- 脚本会在关键步骤提示您确认操作,您可以选择 `y`(是)或 `N`(否)
- 所有操作都会有明确的成功或失败提示
- 操作完成后会显示操作结果摘要
脚本也支持通过命令行参数直接执行特定功能:
### 2. 命令行模式(高级用户使用)
如果您熟悉命令行操作,也可以通过命令行参数直接执行特定功能:
```
bash
sudo ./issue_handler.sh --action
<action
_name
>
```
...
...
@@ -109,6 +96,8 @@ sudo ./issue_handler.sh --action fix_permissions
sudo ./issue_handler.sh --action clean_deleted_files_cron
```
**注意**:命令行模式适合高级用户或自动化任务,普通用户建议使用交互式模式。
## 详细功能说明
### 更新版本包
...
...
@@ -161,14 +150,27 @@ sudo ./issue_handler.sh --action clean_deleted_files_cron
### 系统磁盘问题处理
#### 功能说明
包括
两
个子功能:
包括
四
个子功能:
1. 清理已删除但未释放的文件
2. 轮转过大的日志文件
3. 清理数据库system_log表中30天前的历史数据
4. 磁盘分区调整参考指南(高风险操作,仅提供手动处理步骤)
#### 操作步骤
1. 选择对应的功能选项
2. 根据提示进行确认操作
3. 脚本会自动执行相关处理
1. 在主菜单中输入 `4` 并按回车进入系统磁盘问题处理菜单
2. 根据需要选择子功能:
- `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
## 安全机制
脚本内置多种安全机制确保操作安全:
为了保护您的系统和数据安全,脚本内置了多种安全机制:
1. **权限检查**:脚本运行时会检查是否具有足够的权限执行操作,如果没有会给出明确提示
2. **文件备份**:在修改任何重要文件之前,脚本会自动创建备份文件,文件名包含操作时间和日期,如 `filename_backup_20231201_120000`
1. **权限检查**:运行时会提示建议使用root权限
2. **文件备份**:关键文件操作前会自动创建备份
3. **操作确认**:高风险操作前会询问用户确认
4. **错误恢复**:操作失败时会尝试恢复到之前状态
5. **路径验证**:执行操作前会验证目标路径的有效性
6. **日志记录**:所有操作都会记录到日志文件中,便于审计和问题排查
3. **操作确认**:对于可能影响系统运行的重要操作(如删除文件、重启服务等),脚本会询问您的确认,您可以选择继续或取消操作
4. **错误恢复**:如果某个操作失败,脚本会尝试恢复到操作之前的状态,最大程度保护您的数据
5. **路径验证**:在执行任何文件操作之前,脚本会验证目标路径的有效性,避免误操作
6. **日志记录**:所有操作都会详细记录到日志文件中,包括操作时间、操作内容、成功或失败状态等,便于后续查询和问题排查
7. **高风险操作保护**:对于特别危险的操作(如磁盘分区调整),脚本不会自动执行,仅提供详细的操作指南和注意事项供您参考
## 故障排除
如果您在使用过程中遇到问题,请参考以下解决方案:
### 常见问题
1. **脚本无执行权限**
```
**问题表现**:运行脚本时提示 "Permission denied"
**解决方法**:
```
bash
chmod +x issue_handler.sh
```
2. **操作被拒绝**
确保以root权限运行脚本
**问题表现**:执行操作时提示权限不足或被拒绝
**解决方法**:确保以root权限运行脚本
```
bash
sudo ./issue_handler.sh
```
3. **找不到lsof或zip命令**
安装相应的工具包:
**问题表现**:执行某些功能时提示缺少相关命令
**解决方法**:安装相应的工具包:
```
bash
# CentOS/RHEL/Fedora
yum install lsof zip
...
...
@@ -276,28 +294,102 @@ sudo ./issue_handler.sh --action clean_deleted_files_cron
apt-get install lsof zip
```
4. **数据库连接失败**
**问题表现**:执行数据库清理操作时提示连接失败
**解决方法**:
- 确认数据库服务正在运行
- 确认输入的数据库密码正确
- 如果问题持续存在,请联系DBA或技术支持
5. **磁盘空间不足**
**问题表现**:执行备份或导出操作时提示空间不足
**解决方法**:
- 清理不必要的文件释放空间
- 选择性执行磁盘清理功能(选项4)
- 联系系统管理员扩展磁盘空间
### 日志查看
脚本执行过程中会输出详细的操作日志,包括:
- [INFO]:一般信息
- [WARN]:警告信息
- [ERROR]:错误信息
- [DEBUG]:调试信息
- [INFO]:一般信息
,表示正常操作步骤
- [WARN]:警告信息
,表示需要注意但不影响继续执行的情况
- [ERROR]:错误信息
,表示操作失败或遇到问题
- [DEBUG]:调试信息
,用于技术排查
日志文件位于脚本同级目录,文件名为`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
# 每天凌晨3点执行清理已删除但未释放的文件
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
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论