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

feat(server-check): 实现服务器自检模块化拆分功能

- 更新需求文档中的完成状态标记和进度跟踪
- 创建系统基础信息检测模块 01_system_basic.sh
- 创建CPU资源检测模块 02_cpu_check.sh,包含使用率和TOP5进程检测
- 创建内存资源检测模块 03_memory_check.sh,包含使用率和NUMA架构检测
- 创建磁盘资源检测模块 04_disk_check.sh,包含SMART健康状态检测
- 创建OOM和内核异常检测模块 05_oom_check.sh
- 实现各模块的独立执行和统一输出格式
- 完成第一
上级 d5553c19
This source diff could not be displayed because it is too large. You can view the blob instead.
# PowerShell脚本中文编码问题解决方案
## 问题描述
在Windows PowerShell中执行包含中文字符的脚本时,出现以下错误:
1. **解析错误**:中文字符被错误解析,导致语法错误
2. **乱码显示**:脚本中的中文显示为乱码
3. **变量名问题**:中文变量名导致PowerShell解析失败
## 问题根源
1. **文件编码不一致**
- Git仓库中的文件使用UTF-8编码
- Windows PowerShell默认使用系统编码(GBK)
- 使用Bash/Cat等工具复制文件时可能改变编码
2. **BOM标记问题**
- PowerShell期望UTF-8文件带有BOM标记
- 纯UTF-8文件可能导致PowerShell解析错误
3. **编辑器编码设置**
- 不同编辑器保存文件时的编码设置不同
## 解决方案
### 方案1:使用PowerShell的Out-File命令(推荐)
```powershell
# 读取原文件并重新保存,确保UTF-8编码
$content = Get-Content "source.ps1" -Raw -Encoding UTF8
$content | Out-File -FilePath "dest.ps1" -Encoding UTF8 -NoNewline
```
**优点**
- PowerShell原生支持
- 自动处理BOM标记
- 编码一致性好
### 方案2:使用.NET方法
```powershell
# 使用System.IO.File类
$utf8 = New-Object System.Text.UTF8Encoding $false # $false = 无BOM
$content = [System.IO.File]::ReadAllText("source.ps1", $utf8)
[System.IO.File]::WriteAllText("dest.ps1", $content, $utf8)
```
### 方案3:使用Python(跨平台)
```python
# 读取并写入UTF-8文件
with open('source.ps1', 'r', encoding='utf-8') as f:
content = f.read()
with open('dest.ps1', 'w', encoding='utf-8') as f:
f.write(content)
```
**注意事项**
- Python默认写入UTF-8不带BOM
- 可能需要额外添加BOM标记
### 方案4:避免使用中文变量名
```powershell
# 错误示例 - 中文变量名
$script:检测结果 = @{}
$script:严重问题 = @()
# 正确示例 - 英文变量名,中文输出
$script:TestResults = @{}
$script:CriticalIssues = @{}
# 输出时使用中文
Write-Host "检测完成!"
```
## 实际应用案例
### 问题场景
1. 使用Bash的`cat``cp`命令复制文件后,文件编码改变
2. 使用Write工具创建的PowerShell脚本,中文显示为乱码
3. 直接编辑保存的脚本,PowerShell无法解析
### 解决过程
1. **验证文件编码**
```bash
file "script.ps1" # 检查文件编码
```
2. **使用PowerShell重新创建文件**
```powershell
$content = Get-Content "script.ps1" -Raw -Encoding UTF8
$content | Out-File -FilePath "script_new.ps1" -Encoding UTF8 -NoNewline
```
3. **验证结果**
```powershell
# 检查中文是否正确
$content = Get-Content "script_new.ps1" -Raw -Encoding UTF8
"服务器健康监测脚本" -in $content # 应该返回True
```
## 最佳实践
### 1. 文件创建
- **始终使用PowerShell的Out-File**创建包含中文的脚本
- 或者使用支持UTF-8 BOM的编辑器(如VS Code、PowerShell ISE)
### 2. 变量命名
- **使用英文变量名**,中文仅用于显示输出
- 这样可以避免编码问题导致的解析错误
### 3. 文件传输
- 使用PowerShell命令而非Bash命令复制文件
- 或确保使用二进制模式传输
### 4. 编码声明
在脚本开头添加编码设置:
```powershell
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
```
## 工具对比
| 工具 | UTF-8支持 | BOM处理 | 推荐度 |
|------|-----------|---------|--------|
| PowerShell Out-File | ✅ | ✅ | ⭐⭐⭐⭐⭐ |
| .NET File类 | ✅ | ⚠️ | ⭐⭐⭐⭐ |
| Python | ✅ | ❌ | ⭐⭐⭐ |
| Bash cat/cp | ⚠️ | ❌ | ⭐ |
| Write工具 | ⚠️ | ❌ | ⭐ |
## 总结
编码问题的核心解决方案是:**使用PowerShell原生的Out-File命令处理包含中文的脚本文件**,同时避免使用中文作为变量名。
---
*文档创建日期: 2026-05-09*
*适用版本: PowerShell 5.1+*
# 模块语法错误修复记录
## 修复日期
2026-05-09
## 问题描述
运行模块化脚本时,部分模块报告语法错误,导致:
1. 模块无法正常执行
2. 生成的报告没有数据
3. 只显示错误信息
## 已修复的错误
### 1. system/08_security_check.sh - 函数名语法错误
**错误信息**
```
行 163: 未预期的记号 "(" 附近有语法错误
system/08_security_check.sh: 行 163: `check anomalous_accounts() {'
```
**原因**:函数名包含空格
```bash
# 错误的函数名
check anomalous_accounts() {
```
**修复**
```bash
# 正确的函数名(使用下划线)
check_anomalous_accounts() {
```
**文件位置**`E:\GithubData\ubains-module-test\AuxiliaryTool\ScriptTool\服务器监测\lib\system\08_security_check.sh:163`
---
### 2. service/22_mysql_basic.sh - 字符串引号错误
**错误信息**
```
行 257: 寻找匹配的 `'' 时遇到了未预期的 EOF
```
**原因**:行226的字符串引号位置错误
```bash
# 错误的代码
innodb_buffer_pool_size=$(mysql_exec "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';" 2>/dev/null | tail -n +2 | awk '{print int($2/1024/1024)}"MB)
↑ 错误:引号位置不对
```
**修复**
```bash
# 正确的代码
innodb_buffer_pool_size=$(mysql_exec "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';" 2>/dev/null | tail -n +2 | awk '{print int($2/1024/1024)"MB"}')
↑ 修正:引号在正确位置
```
**文件位置**`E:\GithubData\ubains-module-test\AuxiliaryTool\ScriptTool\服务器监测\lib\service\22_mysql_basic.sh:226`
---
## 验证结果
运行语法检查:
```bash
bash -n lib/system/08_security_check.sh # ✓ 通过
bash -n lib/service/22_mysql_basic.sh # ✓ 通过
```
对所有模块进行语法检查:
```bash
for f in system/*.sh service/*.sh; do
bash -n "$f" 2>&1 || echo "ERROR in $f"
done
```
**结果**:所有模块语法检查通过 ✓
---
## 部署说明
### 1. 复制修复后的文件到测试目录
```powershell
# 复制security模块
Copy-Item "E:\GithubData\ubains-module-test\AuxiliaryTool\ScriptTool\服务器监测\lib\system\08_security_check.sh" `
"C:\Users\UBAINS\Desktop\Test\lib\system\08_security_check.sh" -Force
# 复制mysql模块
Copy-Item "E:\GithubData\ubains-module-test\AuxiliaryTool\ScriptTool\服务器监测\lib\service\22_mysql_basic.sh" `
"C:\Users\UBAINS\Desktop\Test\lib\service\22_mysql_basic.sh" -Force
```
### 2. 运行测试脚本
```powershell
cd C:\Users\UBAINS\Desktop\Test
.\check_server_health_modular.ps1 -Host 192.168.5.46 -User root -Password "ubains@1234"
```
### 3. 预期结果
- ✓ 所有模块正常执行
- ✓ 报告包含完整的检测数据
- ✓ 无语法错误提示
- ✓ 日志输出包含INFO级别的模块执行信息
---
## 经验总结
1. **Shell脚本函数命名规范**:函数名不能包含空格,应使用下划线连接
2. **字符串引号配对**:在复杂的命令替换中,务必确保引号配对正确
3. **语法检查工具**:使用 `bash -n script.sh` 可以在不执行脚本的情况下检查语法错误
4. **错误定位**:bash报告的行号有时不准确,需要结合上下文判断真正的问题位置
---
## 相关文件
- [ ] `lib/system/08_security_check.sh` - 已修复
- [ ] `lib/service/22_mysql_basic.sh` - 已修复
- [ ] `docs/模块语法错误修复记录.md` - 本文档
# 模块化脚本路径配置问题修复记录
## 问题描述
在执行模块化脚本时,所有模块都报错:
```
ERROR: 配置文件不存在: /tmp/config.sh
```
## 问题原因
1. **Shell环境问题**:通过SSH执行bash命令时,可能使用的是sh而非bash
2. **路径解析问题**`cd && source`的链式命令在某些SSH环境中不能正确保持工作目录
3. **变量继承问题**:环境变量在SSH子shell中可能丢失
## 修复方案
### 修改前的执行命令
```powershell
$execCmd = "cd $modulePath && source config.sh && source common.sh && $Category/$ModuleName"
```
### 修改后的执行命令
```powershell
$execCmd = "cd $modulePath && bash -c 'source config.sh && source common.sh && $Category/$ModuleName'"
```
**改进点**
1. 显式使用`bash -c`确保bash环境
2. 使用单引号包裹命令序列,确保在远程shell中正确执行
3. 明确的命令边界,避免路径解析问题
## 验证方法
修复后,重新执行脚本应该看到:
```
[INFO] 执行模块: system/01_system_basic.sh
HOSTNAME:192.168.5.46
OS_VERSION:CentOS Linux 7.9.2009 (Core)
...
```
而不是配置文件不存在的错误。
## 相关文件
- `check_server_health_modular.ps1` - 主脚本(已修复)
- `lib/config.sh` - 配置文件
- `lib/common.sh` - 通用函数库
- `lib/system/*.sh` - 系统检测模块
- `lib/service/*.sh` - 服务检测模块
## 其他注意事项
### 模块中的路径配置
每个模块脚本开头都应设置:
```bash
LIB_DIR="/tmp/check_modules"
if [ -f "$LIB_DIR/config.sh" ]; then
source "$LIB_DIR/config.sh"
else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh"
exit 1
fi
```
这样即使主脚本执行命令有问题,模块也能给出正确的错误提示。
---
*修复日期: 2026-05-09*
# 模块路径配置问题修复记录 v2
## 问题描述
在执行模块化脚本时,所有模块都报错:
```
ERROR: 配置文件不存在: /tmp/config.sh
```
## 根本原因
**common.sh中的LIB_DIR自动计算逻辑冲突**
1. 模块脚本中设置:`LIB_DIR="/tmp/check_modules"`
2. 模块脚本source config.sh(正常)
3. 模块脚本source common.sh
4. **common.sh中的代码**
```bash
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="$(dirname "$SCRIPT_DIR")" # 重新计算LIB_DIR!
```
5. 当common.sh被source时:
- `${BASH_SOURCE[0]}` = `/tmp/check_modules/common.sh`
- `SCRIPT_DIR` = `/tmp/check_modules`
- `LIB_DIR` = `/tmp`(dirname of /tmp/check_modules)
6. 所以common.sh查找的是`/tmp/config.sh`而不是`/tmp/check_modules/config.sh`
## 调试过程
```bash
# 使用bash -x调试模式
bash -x /tmp/check_modules/system/01_system_basic.sh 2>&1 | grep LIB_DIR
# 输出:
+ LIB_DIR=/tmp/check_modules # 模块中设置
+ source /tmp/check_modules/config.sh
++ LIB_DIR=/tmp # common.sh中重新计算!
++ echo 'ERROR: 配置文件不存在: /tmp/config.sh'
```
## 修复方案
### 修改common.sh
**修改前**:
```bash
# 获取脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="$(dirname "$SCRIPT_DIR")"
# 加载配置文件
if [ -f "$LIB_DIR/config.sh" ]; then
source "$LIB_DIR/config.sh"
...
```
**修改后**:
```bash
# 只在LIB_DIR未设置时才计算
if [ -z "$LIB_DIR" ]; then
# 获取脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="$(dirname "$SCRIPT_DIR")"
fi
# 加载配置文件
if [ -f "$LIB_DIR/config.sh" ]; then
source "$LIB_DIR/config.sh"
...
```
**改进点**:
- 检查`LIB_DIR`是否已设置,只在未设置时才计算
- 允许模块脚本预先设置`LIB_DIR`,避免被覆盖
## 验证结果
修复后,模块正常执行:
```
[INFO] 开始系统基础信息检测...
HOSTNAME:localhost
OS_VERSION:openEuler 24.03 (LTS-SP3)
KERNEL_VERSION:6.6.0-132.0.0.111.oe2403sp3.x86_64
...
[INFO] 系统基础信息检测完成
```
## 相关文件
- `lib/common.sh` - 通用函数库(已修复)
- `lib/config.sh` - 配置文件
- `lib/system/*.sh` - 系统检测模块
- `lib/service/*.sh` - 服务检测模块
- `check_server_health_modular.ps1` - 主脚本
## 经验总结
1. **变量覆盖问题**:当脚本库被其他脚本source时,要小心不要覆盖调用者设置的变量
2. **调试技巧**:使用`bash -x`可以清楚看到变量值的变化
3. **防御性编程**:设置变量前检查是否已存在,避免意外覆盖
---
*修复日期: 2026-05-09*
*问题根源: common.sh中LIB_DIR的自动计算覆盖了模块脚本的设置*
# 模块路径配置问题修复记录 - 最终版
## 问题现象
执行模块化脚本时,所有模块都报错:
```
ERROR: 配置文件不存在: /tmp/config.sh
```
## 根本原因分析
### 问题1:common.sh中的LIB_DIR自动计算
**common.sh中的代码**
```bash
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="$(dirname "$SCRIPT_DIR")"
```
当common.sh被source时:
- `${BASH_SOURCE[0]}` = `/tmp/check_modules/common.sh`
- `LIB_DIR` = `/tmp`(而不是预期的`/tmp/check_modules`
### 问题2:bash -c子进程中LIB_DIR为空
**PowerShell中的执行命令**
```powershell
$execCmd = "bash -c 'cd $modulePath && source config.sh && source common.sh && ...'"
```
在bash -c子进程中:
- `$LIB_DIR`变量为空
- common.sh检查`[ -z "$LIB_DIR" ]`返回true
- 重新计算LIB_DIR导致错误路径
## 完整解决方案
### 修复1:common.sh - 添加LIB_DIR检查
```bash
# 修改前
LIB_DIR="$(dirname "$SCRIPT_DIR")"
# 修改后
if [ -z "$LIB_DIR" ]; then
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="$(dirname "$SCRIPT_DIR")"
fi
```
### 修复2:PowerShell执行命令 - 预设LIB_DIR
```powershell
# 修改前
$execCmd = "bash -c 'cd $modulePath && source config.sh && source common.sh && $Category/$ModuleName'"
# 修改后
$execCmd = "bash -c 'LIB_DIR=$modulePath && cd $modulePath && source config.sh && source common.sh && $Category/$ModuleName'"
```
**关键改进**
- 在bash -c中预设`LIB_DIR=$modulePath`
- 确保common.sh不会重新计算LIB_DIR
## 调试过程
```bash
# 1. 测试模块直接执行
bash /tmp/check_modules/system/01_system_basic.sh
# 结果:报错
# 2. 使用调试模式
bash -x /tmp/check_modules/system/01_system_basic.sh
# 发现:LIB_DIR在source common.sh后被重新计算
# 3. 测试带LIB_DIR预设
bash -c 'LIB_DIR=/tmp/check_modules && cd /tmp/check_modules && ...'
# 结果:正常工作
```
## 最终验证
修复后正常输出:
```
[INFO] 开始系统基础信息检测...
HOSTNAME:localhost
OS_VERSION:openEuler 24.03 (LTS-SP3)
KERNEL_VERSION:6.6.0-132.0.0.111.oe2403sp3.x86_64
...
[INFO] 系统基础信息检测完成
```
## 相关文件修改清单
- `lib/common.sh` - 添加LIB_DIR存在性检查
- `check_server_health_modular.ps1` - 执行命令中预设LIB_DIR
- `docs/模块路径配置问题修复_最终版.md` - 本文档
## 经验总结
1. **子shell变量继承**:bash -c创建的子进程不会继承父进程的变量
2. **环境变量传递**:使用`VAR=value cmd`格式在子进程中设置变量
3. **防御性编程**:检查变量是否已设置,避免意外覆盖
4. **调试技巧**:bash -x可以清楚看到变量的变化过程
---
*修复日期: 2026-05-09*
*最终解决方案: bash -c中预设LIB_DIR环境变量*
#!/bin/bash
################################################################################
# 通用函数库
# 说明: 提供可复用的工具函数,包括日志、Docker、系统信息、工具和数据处理
################################################################################
# 只在LIB_DIR未设置时才计算
if [ -z "$LIB_DIR" ]; then
# 获取脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="$(dirname "$SCRIPT_DIR")"
fi
# 加载配置文件
if [ -f "$LIB_DIR/config.sh" ]; then
source "$LIB_DIR/config.sh"
else
echo "ERROR: 配置文件不存在: $LIB_DIR/config.sh" >&2
exit 1
fi
# ==================== 日志函数 ====================
# 输出信息日志
log_info() {
echo "[INFO] $*"
}
# 输出错误日志
log_error() {
echo "[ERROR] $*" >&2
}
# 输出警告日志
log_warn() {
echo "[WARN] $*"
}
# 输出调试日志
log_debug() {
if [ "$DEBUG" = "1" ]; then
echo "[DEBUG] $*"
fi
}
# ==================== Docker通用函数 ====================
# 检查容器是否运行
is_container_running() {
local container=$1
docker ps --format '{{.Names}}' 2>/dev/null | grep -q "^${container}$"
return $?
}
# 获取容器IP
get_container_ip() {
local container=$1
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$container" 2>/dev/null
}
# 在容器中执行命令
exec_in_container() {
local container=$1
shift
local cmd="$@"
if ! is_container_running "$container"; then
log_error "容器 $container 未运行"
return 1
fi
docker exec "$container" sh -c "$cmd" 2>/dev/null
}
# 获取容器状态
get_container_status() {
local container=$1
docker inspect --format='{{.State.Status}}' "$container" 2>/dev/null
}
# 获取容器运行时间
get_container_uptime() {
local container=$1
docker inspect --format='{{.State.StartedAt}}' "$container" 2>/dev/null | \
awk -F'T' '{print $1}' | \
xargs -I {} date -d {} +%s | \
awk '{print systime()-$1}' | \
awk '{print int($1/86400)}'
}
# ==================== 系统信息函数 ====================
# 获取系统运行时间(天数)
get_uptime_days() {
cat /proc/uptime | awk '{print int($1/86400)}'
}
# 获取系统负载
get_loadavg() {
cat /proc/loadavg | awk '{print $1, $2, $3}'
}
# 获取主机名
get_hostname() {
hostname
}
# 获取操作系统版本
get_os_version() {
if [ -f /etc/os-release ]; then
. /etc/os-release
echo "$PRETTY_NAME"
elif [ -f /etc/redhat-release ]; then
cat /etc/redhat-release
elif [ -f /etc/lsb-release ]; then
. /etc/lsb-release
echo "$DISTRIB_DESCRIPTION"
else
uname -s
fi
}
# 获取内核版本
get_kernel_version() {
uname -r
}
# ==================== 工具函数 ====================
# 检查命令是否存在
require_command() {
local cmd=$1
if ! command -v "$cmd" &> /dev/null; then
log_error "命令不存在: $cmd"
return 1
fi
return 0
}
# 检查端口是否开放
check_port() {
local port=$1
local protocol=${2:-tcp}
if [ "$protocol" = "tcp" ]; then
netstat -tuln 2>/dev/null | grep -q ":$port " || ss -tuln 2>/dev/null | grep -q ":$port "
else
netstat -tuln 2>/dev/null | grep -q "\.$port " || ss -tuln 2>/dev/null | grep -q "\.$port "
fi
return $?
}
# 检查进程是否存在
check_process() {
local pname=$1
pgrep -x "$pname" > /dev/null 2>&1
return $?
}
# 数字比较辅助函数
num_compare() {
local val1=$1
local op=$2
local val2=$3
awk "BEGIN {exit !($val1 $op $val2)}"
}
# ==================== 数据处理函数 ====================
# 格式化字节数
format_bytes() {
local bytes=$1
local units=("B" "KB" "MB" "GB" "TB")
local unit=0
while [ $(num_compare "$bytes" ">=" 1024 && echo $?) -eq 0 ] && [ $unit -lt 4 ]; do
bytes=$(awk "BEGIN {printf \"%.2f\", $bytes/1024}")
unit=$((unit + 1))
done
echo "${bytes}${units[$unit]}"
}
# 格式化百分比
format_percent() {
local value=$1
echo "${value}%"
}
# 计算百分比
calc_percent() {
local used=$1
local total=$2
if [ "$total" -eq 0 ]; then
echo "0"
return
fi
awk "BEGIN {printf \"%.2f\", ($used/$total)*100}"
}
# 格式化数字(添加千位分隔符)
format_number() {
local num=$1
echo "$num" | awk '{printf "%'\''d\n", $0}'
}
# ==================== 输出函数 ====================
# 输出检测结果(标准格式)
output_result() {
local key=$1
local value=$2
echo "${key}:${value}"
}
# 输出错误信息(标准格式)
output_error() {
local msg=$1
echo "ERROR:${msg}" >&2
}
# ==================== 验证函数 ====================
# 验证数字
validate_number() {
local value=$1
[[ "$value" =~ ^[0-9]+(\.[0-9]+)?$ ]]
}
# 验证IP地址
validate_ip() {
local ip=$1
[[ "$ip" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]
}
# ==================== 文件操作函数 ====================
# 检查文件是否存在且可读
check_file_readable() {
local file=$1
if [ ! -f "$file" ]; then
log_error "文件不存在: $file"
return 1
fi
if [ ! -r "$file" ]; then
log_error "文件不可读: $file"
return 1
fi
return 0
}
# 获取文件最后修改时间(天数)
get_file_age_days() {
local file=$1
if [ ! -f "$file" ]; then
echo "-1"
return
fi
local mtime=$(stat -c %Y "$file" 2>/dev/null || stat -f %m "$file" 2>/dev/null)
local current=$(date +%s)
echo $(( (current - mtime) / 86400 ))
}
# ==================== 时间函数 ====================
# 获取当前时间戳
get_timestamp() {
date +%s
}
# 格式化时间戳
format_timestamp() {
local ts=$1
local format=${2:-%Y-%m-%d %H:%M:%S}
date -d "@$ts" +"$format" 2>/dev/null || date -r "$ts" +"$format" 2>/dev/null
}
此差异已折叠。
#!/bin/bash
################################################################################
# Python应用检测模块
# 功能: 检测Python容器状态、进程、资源使用等
# 作者: Claude Code
# 日期: 2026-05-09
################################################################################
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="/tmp/check_modules"
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
PYTHON_CONTAINER="${CONTAINERS[python]}"
python_exec() {
docker exec "$PYTHON_CONTAINER" $@ 2>/dev/null
}
main() {
log_info "开始Python应用检测..."
if command -v docker &> /dev/null && docker ps --format "{{.Names}}" | grep -q "^${PYTHON_CONTAINER}$"; then
output_result "PYTHON_CONTAINER" "运行中"
local py_version
py_version=$(python_exec python --version 2>&1 | awk '{print $2}')
[ -n "$py_version" ] && output_result "PYTHON_VERSION" "$py_version"
local py_count
py_count=$(python_exec ps aux | grep -c "python" || echo "0")
output_result "PYTHON_PROCESSES" "$py_count"
local py_mem
py_mem=$(docker stats --no-stream --format "{{.MemUsage}}" "$PYTHON_CONTAINER" 2>/dev/null | head -1)
[ -n "$py_mem" ] && output_result "PYTHON_MEMORY" "$py_mem"
else
output_result "PYTHON_CONTAINER" "未运行"
fi
log_info "Python应用检测完成"
}
main
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论