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

fix(server-monitor): 修复服务器监测脚本配置文件路径错误

- 修改所有系统检测脚本中的配置文件路径从 $LIB_DIR/config.sh 到 $LIB_DIR/lib/config.sh
- 修改所有服务检测脚本中的通用函数库路径从 $LIB_DIR/common.sh 到 $LIB_DIR/lib/common.sh
- 更新PowerShell主脚本中远程目录创建逻辑,添加lib目录并重新上传配置文件
- 增加配置文件和通用函数库上传状态检查及错误处理
- 添加文件上传后的验证机制,确保关键文件存在且版本正确
上级 aa64d2b8
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
X86服务器自动化部署脚本 - 使用 new_auto.sh --all 参数
严格按照需求文档执行部署操作
"""
import sys
import os
import time
import subprocess
import paramiko
import requests
from datetime import datetime
from urllib3.exceptions import InsecureRequestWarning
# 禁用SSL警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
class X86Deployment:
def __init__(self):
self.host = '192.168.5.52'
self.username = 'root'
self.password = 'Ubains@123'
self.deploy_dir = '/data/offline_auto_unifiedPlatform'
self.ssh_client = None
self.start_time = None
def log(self, message, level="INFO"):
"""输出日志"""
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(f"[{timestamp}] [{level}] {message}")
def connect_ssh(self):
"""连接SSH"""
self.log("正在连接SSH服务器...")
try:
self.ssh_client = paramiko.SSHClient()
self.ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.ssh_client.connect(self.host, username=self.username, password=self.password, timeout=30)
self.log("SSH连接成功")
return True
except Exception as e:
self.log(f"SSH连接失败: {str(e)}", "ERROR")
return False
def check_and_cleanup(self):
"""检查并清理现有部署进程"""
self.log("检查并清理现有部署进程...")
try:
# 终止可能存在的new_auto.sh进程
stdin, stdout, stderr = self.ssh_client.exec_command(
"pkill -9 -f new_auto.sh; sleep 2; echo '清理完成'"
)
stdout.read()
self.log("现有进程清理完成")
time.sleep(2)
return True
except Exception as e:
self.log(f"清理进程时出错: {str(e)}", "WARN")
return True
def run_deployment_script(self):
"""执行部署脚本 new_auto.sh --all"""
self.log("=" * 60)
self.log("开始执行部署脚本: new_auto.sh --all")
self.log("=" * 60)
self.start_time = time.time()
try:
# 切换到部署目录并执行脚本
cmd = f"cd {self.deploy_dir} && ./new_auto.sh --all"
self.log(f"执行命令: {cmd}")
self.log("预计部署时间: 40分钟")
# 使用exec_command执行,设置超时
stdin, stdout, stderr = self.ssh_client.exec_command(cmd, get_pty=True)
# 监控部署过程
output_buffer = ""
last_progress_time = time.time()
while True:
# 检查进程状态
if stdout.channel.exit_status_ready():
# 进程已结束
exit_code = stdout.channel.exit_status
self.log(f"部署脚本进程已结束,退出码: {exit_code}")
break
# 读取输出
try:
if stdout.channel.recv_ready():
chunk = stdout.channel.recv(4096).decode('utf-8', errors='ignore')
output_buffer += chunk
# 打印重要输出
if any(keyword in chunk for keyword in ['部署', '安装', '启动', '完成', '成功', '失败', '错误', 'error']):
# 清理并打印
for line in chunk.split('\n'):
line = line.strip()
if line and any(kw in line for kw in ['部署', '安装', '启动', '完成', '成功', '失败', '错误']):
self.log(f"[部署输出] {line}")
except Exception as e:
pass
# 每60秒输出进度
elapsed = int(time.time() - self.start_time)
if elapsed % 60 == 0 and elapsed > 0:
progress_time = time.time()
if progress_time - last_progress_time >= 55: # 避免重复输出
self.log(f"[进度] 部署进行中... 已用时: {int(elapsed/60)}分钟")
last_progress_time = progress_time
# 检查容器状态
self.check_container_status()
# 检查是否超时
if elapsed > 2700: # 45分钟超时
self.log("部署超时", "WARN")
break
time.sleep(5)
# 获取最终输出
remaining_output = stdout.read().decode('utf-8', errors='ignore')
output_buffer += remaining_output
self.log("=" * 60)
self.log("部署脚本执行完成")
self.log("=" * 60)
return True
except Exception as e:
self.log(f"执行部署脚本时出错: {str(e)}", "ERROR")
return False
def check_container_status(self):
"""检查容器状态"""
try:
stdin, stdout, stderr = self.ssh_client.exec_command(
"docker ps --format '{{.Names}}' | wc -l"
)
count = int(stdout.read().decode().strip())
if count > 0:
self.log(f"[容器状态] 运行中的容器数量: {count}")
return count
except:
return 0
def check_deployment_result(self):
"""检查部署结果"""
self.log("=" * 60)
self.log("开始检查部署结果")
self.log("=" * 60)
results = {
'containers': False,
'logs': False,
'external_api': False,
'meeting_api': False,
'monitor_api': False,
'voice_api': False
}
# 1. 检查容器状态
self.log("1. 检查容器状态...")
try:
stdin, stdout, stderr = self.ssh_client.exec_command(
"docker ps --format 'table {{.Names}}\t{{.Status}}'"
)
docker_output = stdout.read().decode('utf-8', errors='ignore')
self.log(f"\n容器状态:\n{docker_output}")
container_count = docker_output.count('\n') - 1 # 减去表头
if container_count >= 5:
self.log(f"[OK] 运行中的容器数量: {container_count}")
results['containers'] = True
else:
self.log(f"[FAIL] 容器数量不足: {container_count}", "ERROR")
except Exception as e:
self.log(f"检查容器状态失败: {str(e)}", "ERROR")
# 2. 检查预定对外服务日志
self.log("\n2. 检查预定对外服务日志...")
log_path = "/data/services/api/java-meeting/java-meeting-extapi/logs/ubains-INFO-AND-ERROR.log"
# 等待日志输出
max_wait = 600 # 10分钟
wait_start = time.time()
while time.time() - wait_start < max_wait:
try:
stdin, stdout, stderr = self.ssh_client.exec_command(
f"tail -100 {log_path} | grep 'SYSTEMVERSION'"
)
log_output = stdout.read().decode('utf-8', errors='ignore')
if 'SYSTEMVERSION' in log_output and 'target_api_integration' in log_output:
self.log(f"[OK] 找到版本信息: {log_output.strip()}")
results['logs'] = True
break
else:
self.log("等待服务启动...")
time.sleep(30)
except Exception as e:
self.log(f"检查日志失败: {str(e)}", "WARN")
time.sleep(30)
else:
self.log("[FAIL] 10分钟后仍未检测到服务启动", "ERROR")
# 3. 使用重试机制检查接口状态
self.log("\n3. 检查接口状态(使用重试机制)...")
# 对外接口
results['external_api'] = self.test_api_with_retry(
"https://192.168.5.52/exapi/message/getMsgPageList",
"无效token",
"预定对外服务接口"
)
# 预定系统接口
results['meeting_api'] = self.test_api_with_retry(
"https://192.168.5.52/meetingV3/api/systemConfiguration/globalConfig?companyNumber=CN-SZ-00-0201",
"accessToken",
"预定系统接口"
)
# 运维集控系统接口
results['monitor_api'] = self.test_api_with_retry(
"https://192.168.5.52/monitor/api2/api/servermonitor/",
"用户不存在",
"运维集控系统接口"
)
# 讯飞转录系统接口
results['voice_api'] = self.test_api_with_retry(
"https://192.168.5.52/voice/api/iflytek/roommaster?company_id=1&user_id=8&company_secret=57d00f9f-020f-5f1f-b788-55fae843bceb&getall=1",
"缺少关键参数",
"讯飞转录系统接口"
)
# 输出结果摘要
self.log("=" * 60)
self.log("部署检查结果摘要")
self.log("=" * 60)
total_time = int((time.time() - self.start_time) / 60)
self.log(f"总用时: {total_time} 分钟")
for key, value in results.items():
status = "[OK]" if value else "[FAIL]"
self.log(f"{status} {key}")
all_ok = all(results.values())
if all_ok:
self.log("\n[SUCCESS] 部署验收通过!")
else:
self.log("\n[WARN] 部署存在问题,请检查上述失败项")
return all_ok
def test_api_with_retry(self, url, expected_keyword, api_name):
"""使用重试机制测试API"""
self.log(f"\n测试 {api_name}: {url}")
retry_count = 0
max_retries = 5
while retry_count < max_retries:
try:
response = requests.get(url, verify=False, timeout=30)
response_text = response.text
# 检查是否包含预期关键词
if expected_keyword in response_text:
self.log(f"[OK] {api_name} 响应正常 (尝试 {retry_count + 1}/{max_retries})")
return True
elif '<!DOCTYPE html>' in response_text and 'Error' in response_text:
self.log(f"[FAIL] {api_name} 返回错误页面 (尝试 {retry_count + 1}/{max_retries})")
else:
self.log(f"[WARN] {api_name} 响应不符合预期 (尝试 {retry_count + 1}/{max_retries})")
self.log(f"响应内容: {response_text[:200]}")
except Exception as e:
self.log(f"[WARN] {api_name} 请求失败 (尝试 {retry_count + 1}/{max_retries}): {str(e)}")
retry_count += 1
if retry_count < max_retries:
self.log("等待30秒后重试...")
time.sleep(30)
self.log(f"[FAIL] {api_name} 经过 {max_retries} 次尝试后仍然失败", "ERROR")
return False
def check_service_logs(self):
"""检查服务日志是否有异常"""
self.log("\n检查服务日志...")
log_paths = {
"预定对外服务": "/data/services/api/java-meeting/java-meeting-extapi/logs/ubains-INFO-AND-ERROR.log",
"预定对内服务": "/data/services/api/java-meeting/java-meeting2.0/logs/ubains-INFO-AND-ERROR.log",
"运维服务": "/data/services/api/python-cmdb/log/uinfo.log",
"讯飞服务": "/data/services/api/python-voice/log/uinfo.log"
}
for service_name, log_path in log_paths.items():
try:
stdin, stdout, stderr = self.ssh_client.exec_command(
f"tail -50 {log_path} 2>/dev/null || echo '日志文件不存在'"
)
log_output = stdout.read().decode('utf-8', errors='ignore')
if 'ERROR' in log_output.upper() or 'EXCEPTION' in log_output.upper():
self.log(f"[WARN] {service_name} 日志中发现异常:", "WARN")
else:
self.log(f"[OK] {service_name} 日志正常")
except Exception as e:
self.log(f"[WARN] 无法读取 {service_name} 日志: {str(e)}", "WARN")
def close(self):
"""关闭连接"""
if self.ssh_client:
self.ssh_client.close()
self.log("SSH连接已关闭")
def main():
print("=" * 80)
print("X86服务器远程自动化部署")
print("目标服务器: 192.168.5.52")
print("部署脚本: new_auto.sh --all")
print("=" * 80)
print()
deploy = X86Deployment()
try:
# 1. 连接SSH
if not deploy.connect_ssh():
return 1
# 2. 清理现有进程
deploy.check_and_cleanup()
# 3. 执行部署脚本
if not deploy.run_deployment_script():
return 1
# 4. 等待服务启动
deploy.log("\n等待服务启动...")
time.sleep(60)
# 5. 检查部署结果
success = deploy.check_deployment_result()
# 6. 检查服务日志
deploy.check_service_logs()
# 7. 输出后续步骤
print("\n" + "=" * 80)
print("部署脚本执行完成")
print("=" * 80)
print("\n后续步骤:")
print("1. 系统授权: https://192.168.5.52/#/LoginConfig")
print(" 账号: superadmin / Ubains@1357")
print(" 验证码: csba")
print(" 授权文件: \\\\192.168.9.9\\发布版本\\03服务器部署\\临时使用-新统一平台\\测试授权文件-请勿使用\\5.52授权文件\\license.zip")
print("\n2. 创建管理员: 为'自动化'公司创建admin用户")
print("\n3. 前台访问: https://192.168.5.52/")
print(" 后台访问: https://192.168.5.52/#/LoginAdmin")
deploy.close()
return 0 if success else 1
except Exception as e:
deploy.log(f"部署过程出错: {str(e)}", "ERROR")
import traceback
traceback.print_exc()
deploy.close()
return 1
if __name__ == '__main__':
sys.exit(main())
...@@ -262,8 +262,12 @@ function Publish-Modules { ...@@ -262,8 +262,12 @@ function Publish-Modules {
Write-Log "开始上传检测模块到远程服务器..." Write-Log "开始上传检测模块到远程服务器..."
try { try {
# 创建远程模块目录 # 清理并重新创建远程模块目录(确保使用最新文件)
$mkdirResult = Invoke-SSHCommand "mkdir -p $modulePath/{system,service,utils}" Write-Log "清理旧模块目录..."
Invoke-SSHCommand "rm -rf $modulePath" | Out-Null
# 创建远程模块目录(包含lib目录)
$mkdirResult = Invoke-SSHCommand "mkdir -p $modulePath/{lib,system,service,utils}"
Write-Log "创建远程模块目录: $modulePath" Write-Log "创建远程模块目录: $modulePath"
# 上传配置文件 # 上传配置文件
...@@ -272,9 +276,20 @@ function Publish-Modules { ...@@ -272,9 +276,20 @@ function Publish-Modules {
if (Test-Path $localConfig) { if (Test-Path $localConfig) {
$pscpPath = Join-Path $scriptPath "pscp.exe" $pscpPath = Join-Path $scriptPath "pscp.exe"
if (Test-Path $pscpPath) { if (Test-Path $pscpPath) {
& $pscpPath -P $script:Port -l $script:Username -pw $script:Password $localConfig "${script:Username}@${script:HostName}:$modulePath/lib/" 2>&1 | Out-Null $uploadResult = & $pscpPath -P $script:Port -l $script:Username -pw $script:Password $localConfig "${script:Username}@${script:HostName}:$modulePath/lib/" 2>&1
if ($LASTEXITCODE -eq 0) {
Write-Log "config.sh 上传完成" Write-Log "config.sh 上传完成"
} }
else {
Write-Log "config.sh 上传失败: $uploadResult" "ERROR"
}
}
else {
Write-Log "pscp.exe 不存在于: $pscpPath" "ERROR"
}
}
else {
Write-Log "本地配置文件不存在: $localConfig" "ERROR"
} }
# 上传通用函数库 # 上传通用函数库
...@@ -283,9 +298,17 @@ function Publish-Modules { ...@@ -283,9 +298,17 @@ function Publish-Modules {
if (Test-Path $localCommon) { if (Test-Path $localCommon) {
$pscpPath = Join-Path $scriptPath "pscp.exe" $pscpPath = Join-Path $scriptPath "pscp.exe"
if (Test-Path $pscpPath) { if (Test-Path $pscpPath) {
& $pscpPath -P $script:Port -l $script:Username -pw $script:Password $localCommon "${script:Username}@${script:HostName}:$modulePath/lib/" 2>&1 | Out-Null $uploadResult = & $pscpPath -P $script:Port -l $script:Username -pw $script:Password $localCommon "${script:Username}@${script:HostName}:$modulePath/lib/" 2>&1
if ($LASTEXITCODE -eq 0) {
Write-Log "common.sh 上传完成" Write-Log "common.sh 上传完成"
} }
else {
Write-Log "common.sh 上传失败: $uploadResult" "ERROR"
}
}
}
else {
Write-Log "本地通用函数库不存在: $localCommon" "ERROR"
} }
# 上传系统模块 # 上传系统模块
...@@ -320,6 +343,63 @@ function Publish-Modules { ...@@ -320,6 +343,63 @@ function Publish-Modules {
Write-Log "设置模块执行权限..." Write-Log "设置模块执行权限..."
Invoke-SSHCommand "chmod +x $modulePath/system/*.sh $modulePath/service/*.sh $modulePath/lib/*.sh" | Out-Null Invoke-SSHCommand "chmod +x $modulePath/system/*.sh $modulePath/service/*.sh $modulePath/lib/*.sh" | Out-Null
# 验证关键文件是否存在
Write-Log "验证上传文件..."
$configCheck = Invoke-SSHCommand "test -f $modulePath/lib/config.sh && echo 'OK' || echo 'FAIL'"
$commonCheck = Invoke-SSHCommand "test -f $modulePath/lib/common.sh && echo 'OK' || echo 'FAIL'"
if ($configCheck -match "OK" -and $commonCheck -match "OK") {
Write-Log "关键文件验证成功!" "INFO"
# 检查模块文件内容,确认是否为新版本(检查source行)
Write-Log "检查模块文件版本..."
$moduleSourceCheck = Invoke-SSHCommand "grep 'source.*lib/config.sh' $modulePath/system/01_system_basic.sh"
if ($moduleSourceCheck -match 'source.*"\$LIB_DIR/lib/config.sh"') {
Write-Log "模块文件版本正确!" "INFO"
}
else {
Write-Log "模块文件版本错误!检测到: $moduleSourceCheck" "WARN"
Write-Log "正在强制重新上传所有模块文件..." "WARN"
# 强制重新上传system和service模块
$pscpPath = Join-Path $scriptPath "pscp.exe"
$systemModuleDir = Join-Path $libPath "system"
if (Test-Path $systemModuleDir) {
foreach ($module in $ModuleConfig.SystemModules) {
$localModule = Join-Path $systemModuleDir $module
if (Test-Path $localModule) {
$uploadResult = & $pscpPath -P $script:Port -l $script:Username -pw $script:Password $localModule "${script:Username}@${script:HostName}:$modulePath/system/" 2>&1
Write-Log " 重新上传 system/$module"
}
}
}
$serviceModuleDir = Join-Path $libPath "service"
if (Test-Path $serviceModuleDir) {
foreach ($module in $ModuleConfig.ServiceModules) {
$localModule = Join-Path $serviceModuleDir $module
if (Test-Path $localModule) {
$uploadResult = & $pscpPath -P $script:Port -l $script:Username -pw $script:Password $localModule "${script:Username}@${script:HostName}:$modulePath/service/" 2>&1
Write-Log " 重新上传 service/$module"
}
}
}
# 重新验证
$moduleSourceCheck = Invoke-SSHCommand "grep 'source.*lib/config.sh' $modulePath/system/01_system_basic.sh"
if ($moduleSourceCheck -match 'source.*"\$LIB_DIR/lib/config.sh"') {
Write-Log "重新上传后验证成功!" "INFO"
} else {
Write-Log "重新上传后仍然失败!内容: $moduleSourceCheck" "ERROR"
}
}
}
else {
Write-Log "关键文件验证失败!config.sh: $configCheck, common.sh: $commonCheck" "ERROR"
return $false
}
Write-Log "所有模块上传完成!" "INFO" Write-Log "所有模块上传完成!" "INFO"
return $true return $true
} }
...@@ -341,8 +421,8 @@ function Invoke-ModuleCheck { ...@@ -341,8 +421,8 @@ function Invoke-ModuleCheck {
try { try {
$remoteScript = "$modulePath/$Category/$ModuleName" $remoteScript = "$modulePath/$Category/$ModuleName"
# 执行远程模块 # 直接执行模块(不source配置文件,模块内部会自己处理)
$result = Invoke-SSHCommand "cd $modulePath && source lib/config.sh && source lib/common.sh && $Category/$ModuleName" -Timeout 60 $result = Invoke-SSHCommand "cd $modulePath && bash $Category/$ModuleName" -Timeout 60
if ($null -eq $result) { if ($null -eq $result) {
Write-Log "模块 $ModuleName 执行超时或失败" "WARN" Write-Log "模块 $ModuleName 执行超时或失败" "WARN"
...@@ -597,12 +677,35 @@ function Save-TestResult { ...@@ -597,12 +677,35 @@ function Save-TestResult {
try { try {
if ($script:TestResults.ContainsKey($Category)) { if ($script:TestResults.ContainsKey($Category)) {
$currentValue = $script:TestResults[$Category]
# 判断当前值是哈希表还是数组
if ($currentValue -is [hashtable]) {
# 哈希表类型:使用键值对存储(用于系统基础信息)
$script:TestResults[$Category][$Result.Name] = $Result
}
elseif ($currentValue -is [array]) {
# 数组类型:追加元素
$script:TestResults[$Category] += $Result $script:TestResults[$Category] += $Result
} }
else { else {
# 未初始化:根据分类类型初始化
if ($Category -eq "系统基础信息") {
$script:TestResults[$Category] = @{$Result.Name = $Result}
} else {
$script:TestResults[$Category] = @($Result) $script:TestResults[$Category] = @($Result)
} }
} }
}
else {
# 键不存在,根据分类类型初始化
if ($Category -eq "系统基础信息") {
$script:TestResults[$Category] = @{$Result.Name = $Result}
} else {
$script:TestResults[$Category] = @($Result)
}
}
}
catch { catch {
Write-Log "保存检测结果失败: $($_.Exception.Message)" "WARN" Write-Log "保存检测结果失败: $($_.Exception.Message)" "WARN"
} }
......
...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
# 加载配置文件和通用函数库 # 加载配置文件和通用函数库
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
else else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1 exit 1
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
else else
echo "ERROR: 通用函数库不存在: $LIB_DIR/common.sh" echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1 exit 1
fi fi
......
...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
# 加载配置文件和通用函数库 # 加载配置文件和通用函数库
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
else else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1 exit 1
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
else else
echo "ERROR: 通用函数库不存在: $LIB_DIR/common.sh" echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1 exit 1
fi fi
......
...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
# 加载配置文件和通用函数库 # 加载配置文件和通用函数库
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
else else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1 exit 1
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
else else
echo "ERROR: 通用函数库不存在: $LIB_DIR/common.sh" echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1 exit 1
fi fi
......
...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
# 加载配置文件和通用函数库 # 加载配置文件和通用函数库
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
else else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1 exit 1
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
else else
echo "ERROR: 通用函数库不存在: $LIB_DIR/common.sh" echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1 exit 1
fi fi
......
...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
# 加载配置文件和通用函数库 # 加载配置文件和通用函数库
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
else else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1 exit 1
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
else else
echo "ERROR: 通用函数库不存在: $LIB_DIR/common.sh" echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1 exit 1
fi fi
......
...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
# 加载配置文件和通用函数库 # 加载配置文件和通用函数库
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
else else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1 exit 1
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
else else
echo "ERROR: 通用函数库不存在: $LIB_DIR/common.sh" echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1 exit 1
fi fi
......
...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
# 加载配置文件和通用函数库 # 加载配置文件和通用函数库
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
else else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1 exit 1
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
else else
echo "ERROR: 通用函数库不存在: $LIB_DIR/common.sh" echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1 exit 1
fi fi
......
...@@ -9,12 +9,12 @@ ...@@ -9,12 +9,12 @@
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
fi fi
PYTHON_CONTAINER="${CONTAINERS[python]}" PYTHON_CONTAINER="${CONTAINERS[python]}"
......
...@@ -9,12 +9,12 @@ ...@@ -9,12 +9,12 @@
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
fi fi
NGINX_CONTAINER="${CONTAINERS[nginx]}" NGINX_CONTAINER="${CONTAINERS[nginx]}"
......
...@@ -9,12 +9,12 @@ ...@@ -9,12 +9,12 @@
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
fi fi
NACOS_CONTAINER="${CONTAINERS[nacos]}" NACOS_CONTAINER="${CONTAINERS[nacos]}"
......
...@@ -9,12 +9,12 @@ ...@@ -9,12 +9,12 @@
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
fi fi
main() { main() {
......
...@@ -9,12 +9,12 @@ ...@@ -9,12 +9,12 @@
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
fi fi
main() { main() {
......
...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
# 加载配置文件和通用函数库 # 加载配置文件和通用函数库
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
else else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1 exit 1
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
else else
echo "ERROR: 通用函数库不存在: $LIB_DIR/common.sh" echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1 exit 1
fi fi
......
...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
# 加载配置文件和通用函数库 # 加载配置文件和通用函数库
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
else else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1 exit 1
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
else else
echo "ERROR: 通用函数库不存在: $LIB_DIR/common.sh" echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1 exit 1
fi fi
......
...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
# 加载配置文件和通用函数库 # 加载配置文件和通用函数库
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
else else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1 exit 1
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
else else
echo "ERROR: 通用函数库不存在: $LIB_DIR/common.sh" echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1 exit 1
fi fi
......
...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
# 加载配置文件和通用函数库 # 加载配置文件和通用函数库
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
else else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1 exit 1
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
else else
echo "ERROR: 通用函数库不存在: $LIB_DIR/common.sh" echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1 exit 1
fi fi
......
...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
# 加载配置文件和通用函数库 # 加载配置文件和通用函数库
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
else else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1 exit 1
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
else else
echo "ERROR: 通用函数库不存在: $LIB_DIR/common.sh" echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1 exit 1
fi fi
......
...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
# 加载配置文件和通用函数库 # 加载配置文件和通用函数库
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
else else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1 exit 1
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
else else
echo "ERROR: 通用函数库不存在: $LIB_DIR/common.sh" echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1 exit 1
fi fi
......
...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
# 加载配置文件和通用函数库 # 加载配置文件和通用函数库
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
else else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1 exit 1
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
else else
echo "ERROR: 通用函数库不存在: $LIB_DIR/common.sh" echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1 exit 1
fi fi
......
...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
# 加载配置文件和通用函数库 # 加载配置文件和通用函数库
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
else else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1 exit 1
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
else else
echo "ERROR: 通用函数库不存在: $LIB_DIR/common.sh" echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1 exit 1
fi fi
......
...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
# 加载配置文件和通用函数库 # 加载配置文件和通用函数库
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
else else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1 exit 1
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
else else
echo "ERROR: 通用函数库不存在: $LIB_DIR/common.sh" echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1 exit 1
fi fi
......
...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
# 加载配置文件和通用函数库 # 加载配置文件和通用函数库
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
else else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1 exit 1
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
else else
echo "ERROR: 通用函数库不存在: $LIB_DIR/common.sh" echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1 exit 1
fi fi
......
...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
# 加载配置文件和通用函数库 # 加载配置文件和通用函数库
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
else else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1 exit 1
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
else else
echo "ERROR: 通用函数库不存在: $LIB_DIR/common.sh" echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1 exit 1
fi fi
......
...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
# 加载配置文件和通用函数库 # 加载配置文件和通用函数库
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
else else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1 exit 1
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
else else
echo "ERROR: 通用函数库不存在: $LIB_DIR/common.sh" echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1 exit 1
fi fi
......
...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
# 加载配置文件和通用函数库 # 加载配置文件和通用函数库
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
else else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1 exit 1
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
else else
echo "ERROR: 通用函数库不存在: $LIB_DIR/common.sh" echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1 exit 1
fi fi
......
...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
# 加载配置文件和通用函数库 # 加载配置文件和通用函数库
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
else else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1 exit 1
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
else else
echo "ERROR: 通用函数库不存在: $LIB_DIR/common.sh" echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1 exit 1
fi fi
......
...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
# 加载配置文件和通用函数库 # 加载配置文件和通用函数库
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
else else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1 exit 1
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
else else
echo "ERROR: 通用函数库不存在: $LIB_DIR/common.sh" echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1 exit 1
fi fi
......
...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ...@@ -11,17 +11,17 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules" LIB_DIR="/tmp/check_modules"
# 加载配置文件和通用函数库 # 加载配置文件和通用函数库
if [ -f "$LIB_DIR/config.sh" ]; then if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/config.sh" source "$LIB_DIR/lib/config.sh"
else else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1 exit 1
fi fi
if [ -f "$LIB_DIR/common.sh" ]; then if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/common.sh" source "$LIB_DIR/lib/common.sh"
else else
echo "ERROR: 通用函数库不存在: $LIB_DIR/common.sh" echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1 exit 1
fi fi
......
# _PRD_脚本报错_问题处理
> 来源:
- `AuxiliaryTool/ScriptTool/服务器监测/check_server_health_v5.ps1`
## 1. 背景与目标
### 1.1 背景
- 执行脚本后报错
### 1.2 目标
- 脚本能够正常运行使用
---
## 2. 问题报错信息
### 2.1 问题一
```
[1/26] 执行: 01_system_basic.sh
[2026-05-15 14:46:13] [INFO] 执行模块: system/01_system_basic.sh
[2026-05-15 14:46:13] [WARN] 保存检测结果失败: 只能将哈希表添加到另一个哈希表中。
[2/26] 执行: 02_cpu_check.sh
[2026-05-15 14:46:13] [INFO] 执行模块: system/02_cpu_check.sh
[2026-05-15 14:46:13] [WARN] 保存检测结果失败: 只能将哈希表添加到另一个哈希表中。
[3/26] 执行: 03_memory_check.sh
[2026-05-15 14:46:13] [INFO] 执行模块: system/03_memory_check.sh
[2026-05-15 14:46:13] [WARN] 保存检测结果失败: 只能将哈希表添加到另一个哈希表中。
[4/26] 执行: 04_disk_check.sh
[2026-05-15 14:46:13] [INFO] 执行模块: system/04_disk_check.sh
[2026-05-15 14:46:14] [WARN] 保存检测结果失败: 只能将哈希表添加到另一个哈希表中。
[5/26] 执行: 05_oom_check.sh
```
# _PRD_保存检测结果失败_问题处理_计划执行
> **源文档**: `_PRD_保存检测结果失败_问题处理.md`
> **生成时间**: 2026-05-15
> **状态**: 已完成
> **完成时间**: 2026-05-15
---
## 1. 问题分析
### 1.1 报错信息
```
[WARN] 保存检测结果失败: 只能将哈希表添加到另一个哈希表中。
```
### 1.2 根本原因
`check_server_health_v5.ps1` 中,`$script:TestResults` 是一个混合类型的哈希表:
```powershell
$script:TestResults = @{
系统基础信息 = @{} # 哈希表
CPU资源 = @() # 数组
内存资源 = @() # 数组
# ...
}
```
`Save-TestResult` 函数使用 `+=` 操作符向数组添加元素:
```powershell
$script:TestResults[$Category] += $Result
```
**问题**:当 `$Category` 为"系统基础信息"时,其值是哈希表 `@{}`,而 `+=` 对哈希表的操作是合并哈希表,不能添加 PSCustomObject,导致报错。
---
## 2. 修复方案
### 2.1 修改 `Save-TestResult` 函数
**位置**: `check_server_health_v5.ps1` 第592-609行
**修复逻辑**:
1. 判断当前分类的值类型
2. 如果是哈希表(系统基础信息),使用键值对方式存储
3. 如果是数组(其他分类),使用 `+=` 添加元素
### 2.2 修改 `New-MarkdownReport` 函数
**位置**: `check_server_health_v5.ps1` 第714-726行
**修复逻辑**:
- "系统基础信息"的处理方式需要适配新的数据结构
---
## 3. 执行步骤
### 步骤1: 修改 `Save-TestResult` 函数
```powershell
function Save-TestResult {
param(
[string]$Category,
[PSCustomObject]$Result
)
try {
if ($script:TestResults.ContainsKey($Category)) {
$currentValue = $script:TestResults[$Category]
# 判断当前值是哈希表还是数组
if ($currentValue -is [hashtable]) {
# 哈希表类型:使用键值对存储
$script:TestResults[$Category][$Result.Name] = $Result
}
elseif ($currentValue -is [array]) {
# 数组类型:追加元素
$script:TestResults[$Category] += $Result
}
else {
# 未初始化:根据分类类型初始化
if ($Category -eq "系统基础信息") {
$script:TestResults[$Category] = @{$Result.Name = $Result}
} else {
$script:TestResults[$Category] = @($Result)
}
}
}
}
catch {
Write-Log "保存检测结果失败: $($_.Exception.Message)" "WARN"
}
}
```
### 步骤2: 验证 `New-MarkdownReport` 函数
确认第714-726行的处理逻辑与新的数据结构兼容:
```powershell
# 系统基础信息
if ($TestResults["系统基础信息"].Count -gt 0) {
$reportLines += "## 系统基础信息"
$reportLines += ""
$info = $TestResults["系统基础信息"]
foreach ($item in $info.Values) {
if ($item -is [PSCustomObject]) {
$status = Get-StatusIcon -Status $item.Status
$reportLines += "- **$($item.Name)**: $($item.Value) $status"
}
}
$reportLines += ""
}
```
**结论**: 此部分逻辑已正确,无需修改。
---
## 4. 测试验证
### 4.1 测试步骤
1. 修复后重新运行脚本
2. 验证不再出现"只能将哈希表添加到另一个哈希表中"错误
3. 验证报告生成正常
### 4.2 预期结果
- 所有检测模块结果正常保存
- Markdown报告完整生成
---
## 5. 优化建议
### 5.1 数据结构优化
建议统一数据结构,避免混合类型:
**方案A**: 全部使用数组
```powershell
$script:TestResults = @{
系统基础信息 = @()
CPU资源 = @()
# ...
}
```
**方案B**: 使用嵌套对象
```powershell
$script:TestResults = [PSCustomObject]@{
系统基础信息 = @{}
CPU资源 = @()
# ...
}
```
### 5.2 类型检查优化
在初始化时明确类型,避免运行时判断。
---
## 6. 变更记录
| 日期 | 版本 | 变更内容 | 作者 |
|------|------|----------|------|
| 2026-05-15 | 1.0 | 创建计划文档 | Claude Code |
---
## 7. 优化功能回填
> 本节记录执行过程中发现的可优化项,执行后回填
### 7.1 已发现问题并修复
#### 问题1: 远程目录创建缺少lib目录
**现象**: 所有模块执行时报错 `lib/config.sh: 没有那个文件或目录`
**根因**: `Publish-Modules` 函数中创建远程目录时未包含 `lib` 目录:
```powershell
# 原代码(错误)
$mkdirResult = Invoke-SSHCommand "mkdir -p $modulePath/{system,service,utils}"
# 修复后(正确)
$mkdirResult = Invoke-SSHCommand "mkdir -p $modulePath/{lib,system,service,utils}"
```
**修复位置**: `check_server_health_v5.ps1` 第266行
**同步更新**:
- 桌面版本: `C:\Users\UBAINS\Desktop\Test\check_server_health_v5.ps1`
- 项目版本: `AuxiliaryTool/ScriptTool/服务器监测/check_server_health_v5.ps1`
### 7.2 待优化项
- [ ] **错误输出被隐藏**: pscp上传命令使用 `| Out-Null` 隐藏了错误输出,建议添加日志记录
- [ ] **文件存在性检查优化**: 上传前应检查本地文件是否存在,避免静默失败
- [ ] **上传失败处理**: 建议添加上传失败后的重试机制
- [ ] **数据结构统一**: 考虑统一使用数组类型,避免混合类型带来的复杂性
# _PRD_脚本报错_问题处理
> 来源:
- `AuxiliaryTool/ScriptTool/服务器监测/check_server_health_v5.ps1`
## 1. 背景与目标
### 1.1 背景
- 执行脚本后报错
### 1.2 目标
- 脚本能够正常运行使用
---
## 2. 问题报错信息
### 2.1 问题一
```
[2026-05-15 15:02:37] [INFO] 执行模块: system/01_system_basic.sh
[2026-05-15 15:02:37] [WARN] 模块 01_system_basic.sh 执行超时或失败
[2/26] 执行: 02_cpu_check.sh
[2026-05-15 15:02:37] [INFO] 执行模块: system/02_cpu_check.sh
[2026-05-15 15:02:37] [WARN] 02_cpu_check.sh 错误: 配置文件不存在: /tmp/check_modules/config.sh
[3/26] 执行: 03_memory_check.sh
[2026-05-15 15:02:37] [INFO] 执行模块: system/03_memory_check.sh
[2026-05-15 15:02:37] [WARN] 03_memory_check.sh 错误: 配置文件不存在: /tmp/check_modules/config.sh
[4/26] 执行: 04_disk_check.sh
[2026-05-15 15:02:37] [INFO] 执行模块: system/04_disk_check.sh
[2026-05-15 15:02:38] [WARN] 04_disk_check.sh 错误: 配置文件不存在: /tmp/check_modules/config.sh
[5/26] 执行: 05_oom_check.sh
[2026-05-15 15:02:38] [INFO] 执行模块: system/05_oom_check.sh
[2026-05-15 15:02:38] [WARN] 05_oom_check.sh 错误: 配置文件不存在: /tmp/check_modules/config.sh
[6/26] 执行: 06_process_check.sh
[2026-05-15 15:02:38] [INFO] 执行模块: system/06_process_check.sh
[2026-05-15 15:02:38] [WARN] 06_process_check.sh 错误: 配置文件不存在: /tmp/check_modules/config.sh
```
# _PRD_配置文件不存在_问题处理_计划执行
> **源文档**: `_PRD_配置文件不存在_问题处理.md`
> **生成时间**: 2026-05-15
> **状态**: 已完成
> **完成时间**: 2026-05-15
---
## 1. 问题分析
### 1.1 报错信息
```
[WARN] 02_cpu_check.sh 错误: 配置文件不存在: /tmp/check_modules/config.sh
```
### 1.2 根本原因
模块脚本中配置文件路径与实际上传路径不匹配:
```bash
# 模块脚本中的路径(错误)
LIB_DIR="/tmp/check_modules"
source "$LIB_DIR/config.sh" # 查找: /tmp/check_modules/config.sh
source "$LIB_DIR/common.sh" # 查找: /tmp/check_modules/common.sh
# 实际上传后的路径
/tmp/check_modules/lib/config.sh # 正确位置
/tmp/check_modules/lib/common.sh # 正确位置
```
---
## 2. 修复方案
### 2.1 批量修改所有模块脚本
**修改位置**: 所有 `lib/system/*.sh``lib/service/*.sh` 文件
**修改内容**:
```bash
# 修改前
if [ -f "$LIB_DIR/config.sh" ]; then
source "$LIB_DIR/config.sh"
fi
if [ -f "$LIB_DIR/common.sh" ]; then
source "$LIB_DIR/common.sh"
fi
# 修改后
if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/lib/config.sh"
fi
if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/lib/common.sh"
fi
```
---
## 3. 执行步骤
### 步骤1: 批量修改system模块
使用sed命令批量替换:
```bash
sed -i 's|$LIB_DIR/config.sh|$LIB_DIR/lib/config.sh|g' lib/system/*.sh
sed -i 's|$LIB_DIR/common.sh|$LIB_DIR/lib/common.sh|g' lib/system/*.sh
```
### 步骤2: 批量修改service模块
```bash
sed -i 's|$LIB_DIR/config.sh|$LIB_DIR/lib/config.sh|g' lib/service/*.sh
sed -i 's|$LIB_DIR/common.sh|$LIB_DIR/lib/common.sh|g' lib/service/*.sh
```
### 步骤3: 验证修改
检查修改后的文件内容是否正确。
---
## 4. 影响范围
### 4.1 需要修改的文件
**system模块** (13个):
- 01_system_basic.sh
- 02_cpu_check.sh
- 03_memory_check.sh
- 04_disk_check.sh
- 05_oom_check.sh
- 06_process_check.sh
- 07_network_check.sh
- 11_scheduled_tasks.sh
- 12_port_check.sh
- 40_comprehensive_diagnosis.sh
- 43_security_compliance.sh
- 44_system_logs.sh
- 45_time_sync.sh
**service模块** (18个):
- 20_docker_basic.sh ~ 33_app_logs.sh
---
## 5. 测试验证
### 5.1 测试步骤
1. 重新上传模块到远程服务器
2. 执行检测脚本
3. 验证不再出现"配置文件不存在"错误
4. 验证检测结果正常输出
---
## 6. 变更记录
| 日期 | 版本 | 变更内容 | 作者 |
|------|------|----------|------|
| 2026-05-15 | 1.0 | 创建计划文档 | Claude Code |
---
## 7. 优化功能回填
> 本节记录执行过程中发现的可优化项,执行后回填
### 7.1 已执行修复
#### 修复内容
批量修改了所有模块脚本中的配置文件路径引用:
**修改命令**:
```bash
# 修改if语句中的路径
sed -i 's|"$LIB_DIR/config.sh"|"$LIB_DIR/lib/config.sh"|g' lib/system/*.sh lib/service/*.sh
sed -i 's|"$LIB_DIR/common.sh"|"$LIB_DIR/lib/common.sh"|g' lib/system/*.sh lib/service/*.sh
# 修改错误消息中的路径
sed -i 's|配置文件不存在: $LIB_DIR/config.sh|配置文件不存在: $LIB_DIR/lib/config.sh|g' lib/system/*.sh lib/service/*.sh
sed -i 's|通用函数库不存在: $LIB_DIR/common.sh|通用函数库不存在: $LIB_DIR/lib/common.sh|g' lib/system/*.sh lib/service/*.sh
```
**影响文件**: 31个模块脚本
- System模块: 13个
- Service模块: 18个
**同步更新**:
- 项目版本: `AuxiliaryTool/ScriptTool/服务器监测/lib/`
- 桌面版本: `C:/Users/UBAINS/Desktop/Test/lib/`
### 7.2 待优化项
- [x] **上传前清理旧文件**: 已添加 `rm -rf $modulePath` 清理旧模块,确保使用最新文件
- [ ] **路径变量优化**: 考虑在模块中定义 `$CONFIG_FILE``$COMMON_LIB` 变量,避免硬编码重复
- [ ] **路径验证**: 在加载配置文件前增加更详细的错误提示和诊断信息
- [ ] **统一模块模板**: 创建模块模板文件,避免此类路径问题再次发生
### 7.3 额外修复
**问题**: pscp上传时服务器上的旧文件没有被覆盖,导致使用旧版本模块
**解决方案**: 在 `Publish-Modules` 函数中添加清理步骤:
```powershell
# 清理并重新创建远程模块目录(确保使用最新文件)
Write-Log "清理旧模块目录..."
Invoke-SSHCommand "rm -rf $modulePath" | Out-Null
```
**修复位置**: `check_server_health_v5.ps1` 第267行
# 自动化部署操作说明
## 0.1 前置准备
1. **服务器资源申请准备**
请按照《新统一平台服务器资源申请说明v1.0.2》确认当前项目是否已申请相关服务器资源,服务器资源信息是否符合。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832153857-6224c2f0-e7fc-473a-a263-123f3ce52610.png)
1. **填写功能授权反馈表**
请按照《新统一平台功能模块授权申请表v1.0.1》填写当前项目所需的相关功能及配套软件。
其中“激活码文件”在下面自动化部署操作流程中有指导导出操作。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832154381-723d9153-5f73-41ed-a44e-80c4efa9ff52.png)
1. **自动化部署包获取**
请在网盘路径:\\192.168.9.9\发布版本\03服务器部署\临时使用-新统一平台\ARM部署包-请勿使用 及时获取最新的自动化部署包。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832154902-66bcfe94-78cc-4f85-b438-a4d75844b209.png)
1. **服务器分区确认**
请连接服务器查看硬盘分区是否正确,分区需将90%的空间分配给/data目录。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832155292-f7941869-2ea6-4588-9f28-3a20150aee70.png)
## 二、部署操作
**1、服务器硬盘检查**
请检查服务区分区是否正确在/data目录
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832155473-ab626773-e901-4b8d-a2b3-67465cfbf531.png)
**2、上传部署包**
将自动化文件
<font style="color:#0000FF;">arm_offline_auto_unifiedPlatform.tar.gz和arm_offline_auto_unifiedPlatform.tar.gz.md5</font>使用xftp工具上传到将要部署的服务器中的<font style="color:#E36C09;">/data</font>目录下。
**3、校验部署包完整性**
(1)进入服务器的data目录:
<font style="color:#FF0000;">cd /data</font>
<font style="color:#FF0000;">ll(检查文件是否齐全)</font>
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832155640-82f1c3c6-02eb-45c2-8214-96400e6ea53c.png)
(2)执行md5校验文件完整性:
<font style="color:#FF0000;">md5sum -c arm_offline_auto_unifiedPlatform.tar.gz.md5</font>
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832155970-d55de28a-2cca-4a5f-ab54-cfec637af1a2.png)
**3、解压并赋权脚本**
(1)解压tar文件:
<font style="color:#FF0000;">tar -zxvf arm_offline_auto_unifiedPlatform.tar.gz</font>
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832156230-8676298b-2d7b-4424-9773-f804b607f266.png)
1. 再进入offline_auto_unifiedPlatform目录:
<font style="color:#FF0000;">cd /data/arm_offline_auto_unifiedPlatform</font>
<font style="color:#FF0000;">ll(检查文件是否齐全)</font>
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832156398-5e1f2d7a-59ec-436c-a570-8c8e8ceb39d8.png)
1. 赋予脚本可执行权限:
<font style="color:#FF0000;">chmod 755 *.sh</font>
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832156696-9843969e-0511-472a-912d-31bd72f193ff.png)
**4、运行脚本**
<font style="color:#FF0000;">./arm_new_auto.sh</font>
注意:如服务器不符合标准规格则需要手动确认是否继续执行脚本(输入<font style="color:#FF0000;">y</font>则继续执行,输入<font style="color:#FF0000;">n</font>则停止执行),如下图所示:
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832156899-0dfdbac6-b36a-4f23-b6fd-872b90dc144b.png)
**5、手动确认服务器网口**
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832157278-c6fbfab4-868f-4869-8ec8-7a9b80567355.png)
**6、手动确认服务器日期和时间**
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832157584-401be271-e942-4a99-bf9b-e617b339e932.png)
若时间不正确,则输入“n”后根据提示进行修改。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832157911-c2631ec5-0f1d-4d93-ba62-e86fe6c899c2.png)
**7、手动确认服务器IP**
需要确认服务器ip是否正确:如果服务器有多网卡,需要选中“否”,输入正确的ip地址,再选中“确认”继续执行部署基础服务。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832158142-b007addb-7d4f-4623-a089-d4bb2967ac1d.png)
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832158735-ce6c95d9-16c6-4211-af66-331b3cbaebe2.png)
**8、请确认需部署的系统**
等待基础服务部署完成后,需要确认当前需部署的系统,勾选对应的系统,敲击回车进行自动化部署操作。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832158991-987afd9f-3d6a-44f5-a8a0-2703ddb46ee7.png)
通过敲击空格勾选对应系统进行自动化部署。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832159235-75e5d50a-2722-493f-9590-a9fa16c347b1.png)
确认所选服务后选择“是”,敲击回车进行自动化部署。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832159428-9cfb4e43-826c-492d-b7b1-d66e31608530.png)
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832159815-3f14f282-bb58-4c97-9d2c-ed8a735b2971.png)
等待日志打印出现如下图所示,并再手动执行source /etc/profile后自动化部署完成。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832160076-87c32517-a6e2-4723-afec-72d30c02391e.png)
## 三、系统授权
1、访问网址:[<font style="color:#FF0000;">https://</font>](https://ip/#/LoginConfig)[<font style="color:#FF0000;">实际IP/#/LoginConfig</font>](https://ip/#/LoginConfig)<font style="color:#FF0000;"> </font>
登录超管账户,默认账号和密码:<font style="color:#FF0000;">superadmin Ubains@1357</font>
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832160472-c9a8266b-771f-425c-ae92-f0b4ca9fedf0.png)
1. 进行系统授权
2. 点击“下载激活文件”,并填写网盘的<font style="color:#FF0000;">《05-新统一平台授权反馈表.xlsx》</font>后提交给研发人员授权,授权后会返回一个新的授权文件license.zip;
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832160730-c86eb761-b0ac-4b71-98e1-d70af928b6e0.png)
1. 点击“上传授权文件”,上次新的license.zip并进行重启,等待页面加载成功即可.
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832160991-00cdcae6-2cd9-4997-882f-2da6d4b979ee.png)
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832161260-ebd8a46e-e818-4590-8941-d12be1a46228.png)
1. 重启服务
勾选“运维系统”、“预定系统2.0”、“预定系统3.0”后点击【重启已选服务】按钮,输入超管账号密码重启服务。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832161494-2d55ba58-6d06-4f63-a628-3636bc45aff9.png)
1. 按照提示填写完成项目相关信息,方便记录和日后的维护,填写完成后点击“保存”;
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832162417-55a90ca9-7068-418e-b1c2-72a123b98413.png)
1. 下载部署视图,需要在填写项目信息后,才能下载部署视图,部署完成后要将部署视图归档到ERP或网盘下;
2. 下载自检文档,部署完成后要将自检文档放到跟部署视图一样的目录下;
## <!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832162682-e1b7184f-109a-41bb-a94f-6bc4a40748b5.png)四、创建公司管理员
**1、打开网页。**
访问网页:<font style="color:#FF0000;">https://实际IP/#/</font>
账号:superadmin
密码:Ubains@1357
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832163062-365e3c90-e925-4be8-8eaa-f63aaeccd8fb.png)
1. **创建管理员**
进入“管理员设置-公司管理员设置”页面,创建管理员后,使用管理员登录网页即可进入对应的公司中,如下图:
**<font style="color:#FF0000;">注:开发返回的授权码会直接创建对应公司,无需手动创建公司</font>****<font style="color:#FF0000;">,只需要创建该公司管理员即可。</font>**
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832163326-91138926-e97d-433c-805f-27f474962593.png)
1. **登录管理员账号**
在登录界面输入新创建的管理员账号密码登录系统,查看是否能够正确使用。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832163685-1a250084-d5a5-4bc8-994d-69d0ace3cc74.png)
1. **创建权限**
后台登录:[https://192.168.5.44/#/LoginAdmin](https://192.168.5.44/#/LoginAdmin)
登录管理员用户后进入【系统管理】-【权限管理】模块下新增权限组,并进行绑定用户。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832163977-d8401131-bd93-4bb7-b5b6-0afadd0cfe2d.png)
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832164365-e685d7ab-d1ef-4ad2-ad01-efcc3c70e25c.png)
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832164647-e01cd074-a55c-4118-8f32-ecf6380ca530.png)
## 0.2 资料归档
请将项目部署资料:《新统一平台功能模块授权申请表》、《项目部署视图表》、《服务自检表》上传至ERP项目资料中进行归档记录。
插入图片:
## 附1:常见操作指令集
### **1、查看服务运行日志**
<font style="color:#FF0000;">tail -f /data/services/api/java-meeting/java-meeting2.0/logs/ubains-INFO-AND-ERROR.log</font>
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832164892-02c3a473-4db9-4041-a6dd-886bfd810aa2.png)
### **2、手动更改服务器时间**
(1)修改日期命令:<font style="color:#FF0000;">date -s 2020/08/20</font>
(2)修改时间命令:<font style="color:#FF0000;">date -s 18:00:00</font>
(3)修改成上海时区:<font style="color:#FF0000;">timedatectl set-timezone Asia/Shanghai</font>
(4)查看当前时间:<font style="color:#FF0000;">date</font>
(5)保存设置:<font style="color:#FF0000;">clock -w</font>
**3、查看容器运行状态**
可通过查看容器运行状态判断预定服务是否异常,执行指令:<font style="color:#FF0000;">docker ps </font>,若该六个容器均显示如图所示即为正常。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832165231-219fe27f-9c15-4fba-8c96-77ad15a991ce.png)
**4、查看服务器最大的前10个文件**
常见服务器磁盘因为日志文件导致爆满,可通过以下指令进行排查:
(1)查看服务器磁盘信息:<font style="color:#FF0000;">df -TH</font>
(2)查看服务器占用磁盘最大的10个文件:<font style="color:#FF0000;">find / -type f -print0 | xargs -0 du | sort -n | tail -10 | cut -f2 | xargs -I{} du -sh {}</font>
## 附2:系统配置页面其他功能介绍
**1、上传更新后端文件**
需要后端打包成zip压缩包更新文件,才能进行上传更新;
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832165446-38339e9d-7b67-458a-8723-941c9d9c5d24.png)
**2、JAR包更新后重启**
上传更新包后,需要点击进行服务重启;
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832165859-04797d32-5a4b-4625-8b7e-033794a36f50.png)
**3、预定服务更新回滚**
服务更新后,如果有bug问题可以点击进行回滚操作,回退到旧的版本;
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832166121-484dba95-36da-4bf7-aac2-7d1dbf95850d.png)
**4、下载日志压缩文件**
点击后看有下载日志的压缩文件,主要用于问题错误分析和排查;
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832166311-a11f03f6-3566-4765-bdb6-8b8beb2b7264.png)
**5、下载配置文件以及前端配置文件**
点击“下载日志压缩文件”和“下载配置文件以及前端配置文件”,即可下载配置文档以及前端配置文件,同时还可以下载数据库备份文件
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832166602-49723710-e486-4100-a8a5-181d8253ac2b.png)
**6、备份数据库文件**
点击后,会自动完成数库的备份。
备份名称为:数据库名+日期.sql
备份路径:/var/www/java/api-java-meeting2.0/config
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832166862-9f3603d5-8b0a-4d91-875e-806df4a0673a.png)
**7、系统监控**
可以实时的监控服务器的CPU、内存、硬盘使用率;以及可以查看docker容器运行状态;
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832167115-41c161b1-fd27-49ff-bcd5-99720d520e6b.png)
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832167404-fd4c9bcb-3974-4c5d-90ef-b47f84dd187d.png)
# 自动化部署操作说明
## 0.1 前置准备
1. **服务器资源申请准备**
请按照《新统一平台服务器资源申请说明v1.0.2》确认当前项目是否已申请相关服务器资源,服务器资源信息是否符合。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832042766-f33ef226-9177-4ccd-b460-ff4164cac4b7.png)
1. **填写功能授权反馈表**
请按照《新统一平台功能模块授权申请表v1.0.1》填写当前项目所需的相关功能及配套软件。
其中“激活码文件”在下面自动化部署操作流程中有指导导出操作。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832043086-fcb356a0-b337-4f63-90da-c13653783553.png)
1. **自动化部署包获取**
请在网盘路径:\\192.168.9.9\发布版本\03服务器部署\临时使用-新统一平台\X86部署包 及时获取最新的自动化部署包。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832043353-53fe3a0e-0538-486b-b912-37fc2798babf.png)
1. **服务器分区确认**
请连接服务器查看硬盘分区是否正确,分区需将90%的空间分配给/data目录。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832043753-9164a329-40dd-49ad-ac0f-e6736230f5c7.png)
## 二、部署操作
**1、服务器硬盘检查**
请检查服务区分区是否正确在/data目录
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832044135-d7cb64d1-0370-47ea-883a-06e80b9fa5be.png)
**2、上传部署包**
将自动化文件
<font style="color:#0000FF;">offline_auto_unifiedPlatform.tar.gz和offline_auto_unifiedPlatform.tar.gz.md5</font>使用xftp工具上传到将要部署的服务器中的<font style="color:#E36C09;">/data</font>目录下。
**3、校验部署包完整性**
(1)进入服务器的data目录:
<font style="color:#FF0000;">cd /data</font>
<font style="color:#FF0000;">ll(检查文件是否齐全)</font>
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832044327-043b6e5b-369f-4283-a2dd-9ea5ee361189.png)
(2)执行md5校验文件完整性:
<font style="color:#FF0000;">md5sum -c offline_auto_unifiedPlatform.tar.gz.md5</font>
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832044541-a231877d-0755-484e-a133-389ac33df5f0.png)
**3、解压并赋权脚本**
(1)解压tar文件:
<font style="color:#FF0000;">tar -zxvf offline_auto_unifiedPlatform.tar.gz</font>
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832044877-2372bf7b-ef86-44e6-8f70-c80c809a8c2f.png)
1. 再进入offline_auto_unifiedPlatform目录:
<font style="color:#FF0000;">cd /data/offline_auto_unifiedPlatform</font>
<font style="color:#FF0000;">ll(检查文件是否齐全)</font>
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832045323-c670545c-e114-4d6e-880f-8f5e507137a5.png)
1. 赋予脚本可执行权限:
<font style="color:#FF0000;">chmod 755 *.sh</font>
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832045689-d17f30df-1bc7-4a25-bf0d-fa4622a21420.png)
**4、运行脚本**
<font style="color:#FF0000;">./new_auto.sh</font>
注意:如服务器不符合标准规格则需要手动确认是否继续执行脚本(输入<font style="color:#FF0000;">y</font>则继续执行,输入<font style="color:#FF0000;">n</font>则停止执行),如下图所示:
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832046096-b1040551-3fe7-43bb-aa4d-ef5d065f291a.png)
**5、手动确认服务器网口**
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832046381-2e432ade-c748-4f4b-ba2f-25560f73ae60.png)
**6、手动确认服务器日期和时间**
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832046680-f75bcc9c-3ead-42cc-a016-28096d61f893.png)
若时间不正确,则输入“n”后根据提示进行修改。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832047065-108d89c3-10a9-459c-a95d-ad98cc2a08f4.png)
**7、手动确认服务器IP**
需要确认服务器ip是否正确:如果服务器有多网卡,需要选中“否”,输入正确的ip地址,再选中“确认”继续执行部署基础服务。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832047345-6de16a15-b02d-4db5-b932-c6f6bb6fbfdc.png)
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832047692-86194b51-647b-4e1e-8be6-e6071c248de1.png)
**8、请确认需部署的系统**
等待基础服务部署完成后,需要确认当前需部署的系统,勾选对应的系统,敲击回车进行自动化部署操作。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832047928-7c549c8c-ec10-4924-bf2e-6c9e4dff5d62.png)
通过敲击空格勾选对应系统进行自动化部署。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832048195-5e4912ea-4de8-4ac5-8a95-09f71ea84270.png)
确认所选服务后选择“是”,敲击回车进行自动化部署。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832048590-c2aa02e9-743a-4f7f-a397-cdb0909fe8e7.png)
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832048889-cbca87e4-4ebc-46f7-9412-11b4732b93ad.png)
等待日志打印出现如下图所示,并再手动执行source /etc/profile后自动化部署完成。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832049291-271ad46c-e605-4738-95d6-fb1948344f21.png)
## 三、系统授权
1、访问网址:[<font style="color:#FF0000;">https://</font>](https://ip/#/LoginConfig)[<font style="color:#FF0000;">实际IP/#/LoginConfig</font>](https://ip/#/LoginConfig)<font style="color:#FF0000;"> </font>
登录超管账户,默认账号和密码:<font style="color:#FF0000;">superadmin Ubains@1357</font>
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832049705-1e32a168-b2f9-4b0c-9464-2a8cd790fa9c.png)
1. 进行系统授权
2. 点击“下载激活文件”,并填写网盘的<font style="color:#FF0000;">《05-新统一平台授权反馈表.xlsx》</font>后提交给研发人员授权,授权后会返回一个新的授权文件license.zip;
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832050013-15ae0aba-12cb-4adf-a05d-ae69950f8717.png)
1. 点击“上传授权文件”,上次新的license.zip并进行重启,等待页面加载成功即可.
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832050240-8a24b033-bc10-4adf-a181-b1231a483f1a.png)
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832050502-f38a5746-09ac-4607-922b-fef7a6aaf8d2.png)
1. 重启服务
勾选“运维系统”、“预定系统2.0”、“预定系统3.0”后点击【重启已选服务】按钮,输入超管账号密码重启服务。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832050807-48556456-fa4f-4087-a6ca-62f32f9c7934.png)
1. 按照提示填写完成项目相关信息,方便记录和日后的维护,填写完成后点击“保存”;
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832051089-d698e7a5-1e60-40b0-a1c6-f533a412b04d.png)
1. 下载部署视图,需要在填写项目信息后,才能下载部署视图,部署完成后要将部署视图归档到ERP或网盘下;
2. 下载自检文档,部署完成后要将自检文档放到跟部署视图一样的目录下;
## <!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832051317-cd5ba0e6-ce0c-4955-b2cd-bb7a2ce87ab2.png)四、创建公司管理员
**1、打开网页。**
访问网页:<font style="color:#FF0000;">https://实际IP/#/</font>
账号:superadmin
密码:Ubains@1357
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832051557-92c01147-b24c-4135-80f9-4bbf4ee2c209.png)
1. **创建管理员**
进入“管理员设置-公司管理员设置”页面,创建管理员后,使用管理员登录网页即可进入对应的公司中,如下图:
**<font style="color:#FF0000;">注:开发返回的授权码会直接创建对应公司,无需手动创建公司</font>****<font style="color:#FF0000;">,只需要创建该公司管理员即可。</font>**
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832051826-e3a9b9ce-9f60-4a56-9110-928ab76c455c.png)
1. **登录管理员账号**
在登录界面输入新创建的管理员账号密码登录系统,查看是否能够正确使用。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832052252-99491ec6-c02d-4696-b6ba-6c3fe50b5764.png)
1. **创建权限**
后台登录:[https://192.168.5.44/#/LoginAdmin](https://192.168.5.44/#/LoginAdmin)
登录管理员用户后进入【系统管理】-【权限管理】模块下新增权限组,并进行绑定用户。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832052604-03b22f9d-e59b-47c3-a490-eee101300677.png)
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832052957-9bb9cb20-3aee-4714-b271-157ec8c717ed.png)
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832053292-7e27d65e-f80b-4ecc-881a-537274d2a578.png)
## 0.2 资料归档
请将项目部署资料:《新统一平台功能模块授权申请表》、《项目部署视图表》、《服务自检表》上传至ERP项目资料中进行归档记录。
插入图片:
## 附1:常见操作指令集
### **1、查看服务运行日志**
<font style="color:#FF0000;">tail -f /data/services/api/java-meeting/java-meeting2.0/logs/ubains-INFO-AND-ERROR.log</font>
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832053576-21a23f9e-701c-4cca-afab-56019ef1c92f.png)
### **2、手动更改服务器时间**
(1)修改日期命令:<font style="color:#FF0000;">date -s 2020/08/20</font>
(2)修改时间命令:<font style="color:#FF0000;">date -s 18:00:00</font>
(3)修改成上海时区:<font style="color:#FF0000;">timedatectl set-timezone Asia/Shanghai</font>
(4)查看当前时间:<font style="color:#FF0000;">date</font>
(5)保存设置:<font style="color:#FF0000;">clock -w</font>
**3、查看容器运行状态**
可通过查看容器运行状态判断预定服务是否异常,执行指令:<font style="color:#FF0000;">docker ps </font>,若该六个容器均显示如图所示即为正常。
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832054035-f361f59c-3874-48fa-85bb-5fc4c949bef5.png)
**4、查看服务器最大的前10个文件**
常见服务器磁盘因为日志文件导致爆满,可通过以下指令进行排查:
(1)查看服务器磁盘信息:<font style="color:#FF0000;">df -TH</font>
(2)查看服务器占用磁盘最大的10个文件:<font style="color:#FF0000;">find / -type f -print0 | xargs -0 du | sort -n | tail -10 | cut -f2 | xargs -I{} du -sh {}</font>
## 附2:系统配置页面其他功能介绍
**1、上传更新后端文件**
需要后端打包成zip压缩包更新文件,才能进行上传更新;
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832054327-681457a3-0dd7-47e7-ae32-7cb5fb4022cc.png)
**2、JAR包更新后重启**
上传更新包后,需要点击进行服务重启;
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832054584-be16021d-312f-4106-8f69-5bc4ed842270.png)
**3、预定服务更新回滚**
服务更新后,如果有bug问题可以点击进行回滚操作,回退到旧的版本;
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832054925-a5ef2f9c-1bc6-4988-8a11-8cafb6990a7f.png)
**4、下载日志压缩文件**
点击后看有下载日志的压缩文件,主要用于问题错误分析和排查;
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832055168-6f44ccdc-9838-4fa2-995d-03a47dc961b3.png)
**5、下载配置文件以及前端配置文件**
点击“下载日志压缩文件”和“下载配置文件以及前端配置文件”,即可下载配置文档以及前端配置文件,同时还可以下载数据库备份文件
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832055443-cc7b336d-2003-4f42-b6b8-22b9ef614cea.png)
**6、备份数据库文件**
点击后,会自动完成数库的备份。
备份名称为:数据库名+日期.sql
备份路径:/var/www/java/api-java-meeting2.0/config
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832055729-88740c09-8274-4cd3-821a-29da590bff69.png)
**7、系统监控**
可以实时的监控服务器的CPU、内存、硬盘使用率;以及可以查看docker容器运行状态;
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832056028-220af92b-76ef-429a-9e3c-8da406c12726.png)
<!-- 这是一张图片,ocr 内容为: -->
![](https://cdn.nlark.com/yuque/0/2026/png/35480611/1778832056559-624e0508-910f-4919-a8e1-a70d2a0d43aa.png)
# 远程自动化部署_需求文档 # 远程自动化部署_需求文档
## 相关资料要求 ## 相关资料要求
### 部署脚本
- AuxiliaryTool/ScriptTool/RemoteDeploy
### 部署包路径 ### 部署包路径
- ARM架构:已上传至对应服务器。 - ARM架构:已上传至对应服务器。先不部署。
- X86架构:已上传至对应服务器。 - X86架构:已上传至对应服务器。
### 目标服务器 ### 目标服务器
...@@ -9,11 +11,11 @@ ...@@ -9,11 +11,11 @@
- ARM架构服务器:192.168.9.76 root Ubains@123 - ARM架构服务器:192.168.9.76 root Ubains@123
### 部署文档 ### 部署文档
- X86部署文档路径:"\\192.168.9.9\发布版本\03服务器部署\临时使用-新统一平台\X86部署包\新统一平台自动化部署操作指导.docx" - X86部署文档路径:"Docs/PRD/远程自动化部署/新统一平台自动化部署操作指导.md"
- ARM部署文档路径:"\\192.168.9.9\发布版本\03服务器部署\临时使用-新统一平台\ARM部署包-请勿使用\新统一平台自动化部署操作指导.docx" - ARM部署文档路径:"Docs/PRD/远程自动化部署/ARM架构_新统一平台自动化部署操作指导.md"
## 授权文件 ## 授权文件
- X86-5.52授权文件路径:"\\192.168.9.9\发布版本\03服务器部署\临时使用-新统一平台\测试授权文件-请勿使用\5.52授权文件\license.zip" - X86-5.52授权文件路径:"E:\自动化部署\X86-5.52\license.zip"
- ARM-9.76授权文件路径:"\\192.168.9.9\发布版本\03服务器部署\临时使用-新统一平台\测试授权文件-请勿使用\9.76授权文件\license.zip" - ARM-9.76授权文件路径:"\\192.168.9.9\发布版本\03服务器部署\临时使用-新统一平台\测试授权文件-请勿使用\9.76授权文件\license.zip"
### 相关服务路径 ### 相关服务路径
......
...@@ -2,33 +2,8 @@ ...@@ -2,33 +2,8 @@
#------------------------------工具类模块--------------------------------------------------- #------------------------------工具类模块---------------------------------------------------
# 日志打印函数 # 日志打印函数
LOG_FILE="/data/logs/new_auto_script.log" LOG_FILE="/data/logs/new_auto_script.log"
mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null" mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null
# 自动部署所有服务的标志(默认false,需要通过--all参数启用)
AUTO_DEPLOY_ALL=false
# 解析命令行参数
while [[ $# -gt 0 ]]; do
case $1 in
--all)
AUTO_DEPLOY_ALL=true
log "INFO" "启用自动部署所有系统模式"
shift
;;
--help|-h)
echo "用法: $0 [选项]"
echo "选项:"
echo " --all 自动部署所有系统(无需手动选择)"
echo " --help 显示此帮助信息"
exit 0
;;
*)
echo "未知参数: $1"
echo "使用 --help 查看帮助信息"
exit 1
;;
esac
done
# 用户输入的东西也同步记录到日志信息里面 # 用户输入的东西也同步记录到日志信息里面
function log() { function log() {
# 获取当前时间 # 获取当前时间
...@@ -71,6 +46,32 @@ function log() { ...@@ -71,6 +46,32 @@ function log() {
echo "[$timestamp] [$level] $message" >> "$LOG_FILE" echo "[$timestamp] [$level] $message" >> "$LOG_FILE"
} }
# 自动部署所有服务的标志(默认false,需要通过--all参数启用)
AUTO_DEPLOY_ALL=false
# 解析命令行参数
while [[ $# -gt 0 ]]; do
case $1 in
--all)
AUTO_DEPLOY_ALL=true
log "INFO" "启用自动部署所有系统模式"
shift
;;
--help|-h)
echo "用法: $0 [选项]"
echo "选项:"
echo " --all 自动部署所有系统(无需手动选择)"
echo " --help 显示此帮助信息"
exit 0
;;
*)
echo "未知参数: $1"
echo "使用 --help 查看帮助信息"
exit 1
;;
esac
done
#------------------------------导入中间件部署模块--------------------------------------------------- #------------------------------导入中间件部署模块---------------------------------------------------
# 获取脚本所在目录 # 获取脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论