mirror of
https://github.com/tradecatlabs/vibe-coding-cn.git
synced 2026-08-16 04:18:04 +00:00
999 lines
24 KiB
Markdown
999 lines
24 KiB
Markdown
TRANSLATED CONTENT:
|
||||
|
|
# 生产级 Shell 控制面板生成规格说明
|
|||
|
|
|
|||
|
|
> **用途**: 本文档作为提示词模板,用于指导 AI 生成符合生产标准的 Shell 交互式控制面板。
|
|||
|
|
>
|
|||
|
|
> **使用方法**: 将本文档内容作为提示词提供给 AI,AI 将基于此规格生成完整的控制面板脚本。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📋 项目需求概述
|
|||
|
|
|
|||
|
|
请生成一个生产级的 Shell 交互式控制面板脚本,用于管理和控制复杂的软件系统。该控制面板必须满足以下要求:
|
|||
|
|
|
|||
|
|
### 核心目标
|
|||
|
|
1. **自动化程度高** - 首次运行自动配置所有依赖和环境,后续运行智能检查、按需安装,而不是每次都安装,只有缺失或者没有安装的时候才安装
|
|||
|
|
2. **生产就绪** - 可直接用于生产环境,无需手动干预
|
|||
|
|
3. **双模式运行** - 支持交互式菜单和命令行直接调用
|
|||
|
|
4. **高可维护性** - 模块化设计,易于扩展和维护
|
|||
|
|
5. **自修复能力** - 自动检测并修复常见问题
|
|||
|
|
|
|||
|
|
### 技术要求
|
|||
|
|
- **语言**: Bash Shell (兼容 bash 4.0+)
|
|||
|
|
- **依赖**: 自动检测和安装(Python3, pip, curl, git)
|
|||
|
|
- **平台**: Ubuntu/Debian, CentOS/RHEL, macOS
|
|||
|
|
- **文件数量**: 单文件实现
|
|||
|
|
- **执行模式**: 幂等设计,可重复执行
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🏗️ 架构设计:5 层核心功能
|
|||
|
|
|
|||
|
|
### Layer 1: 环境检测与自动安装模块
|
|||
|
|
|
|||
|
|
**功能需求**:
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
requirements:
|
|||
|
|
os_detection:
|
|||
|
|
- 自动识别操作系统类型 (Ubuntu/Debian/CentOS/RHEL/macOS)
|
|||
|
|
- 识别系统版本号
|
|||
|
|
- 识别包管理器 (apt-get/yum/dnf/brew)
|
|||
|
|
|
|||
|
|
dependency_check:
|
|||
|
|
- 检查必需依赖: python3, pip3, curl
|
|||
|
|
- 检查推荐依赖: git
|
|||
|
|
- 返回缺失依赖列表
|
|||
|
|
|
|||
|
|
auto_install:
|
|||
|
|
- 提示用户确认安装(交互模式)
|
|||
|
|
- 静默自动安装(--force 模式)
|
|||
|
|
- 调用对应包管理器安装
|
|||
|
|
- 安装失败时提供明确错误信息
|
|||
|
|
|
|||
|
|
venv_management:
|
|||
|
|
- 检测虚拟环境是否存在
|
|||
|
|
- 不存在则创建 .venv/
|
|||
|
|
- 自动激活虚拟环境
|
|||
|
|
- 检查 pip 版本,仅在过旧时升级
|
|||
|
|
- 检查 requirements.txt 依赖是否已安装
|
|||
|
|
- 仅在缺失或版本不匹配时安装依赖
|
|||
|
|
- 所有检查通过则跳过安装,直接进入下一步
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**关键函数**:
|
|||
|
|
```bash
|
|||
|
|
detect_environment() # 检测 OS 和包管理器
|
|||
|
|
command_exists() # 检查命令是否存在
|
|||
|
|
check_system_dependencies() # 检查系统依赖
|
|||
|
|
auto_install_dependency() # 自动安装缺失依赖
|
|||
|
|
setup_venv() # 配置 Python 虚拟环境
|
|||
|
|
check_venv_exists() # 检查虚拟环境是否存在
|
|||
|
|
check_pip_requirements() # 检查 requirements.txt 依赖是否满足
|
|||
|
|
verify_dependencies() # 验证所有依赖完整性,仅缺失时触发安装
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**实现要点**:
|
|||
|
|
- 使用 `/etc/os-release` 检测 Linux 发行版
|
|||
|
|
- 使用 `uname` 检测 macOS
|
|||
|
|
- **智能检查优先**:每次启动前先验证环境和依赖,仅在检测到缺失或版本不符时才执行安装,每次启动前先验证环境和依赖,仅在检测到缺失或版本不符时才执行安装,每次启动前先验证环境和依赖,仅在检测到缺失或版本不符时才执行安装
|
|||
|
|
- **幂等性保证**:重复运行不会重复安装已存在的依赖,避免不必要的时间消耗
|
|||
|
|
- 优雅降级:无法安装时给出手动安装指令
|
|||
|
|
- 支持离线环境检测(跳过自动安装)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Layer 2: 初始化与自修复机制
|
|||
|
|
|
|||
|
|
**功能需求**:
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
requirements:
|
|||
|
|
directory_management:
|
|||
|
|
- 检查必需目录: data/, logs/, modules/, pids/
|
|||
|
|
- 缺失时自动创建
|
|||
|
|
- 设置正确的权限 (755)
|
|||
|
|
|
|||
|
|
pid_cleanup:
|
|||
|
|
- 扫描所有 .pid 文件
|
|||
|
|
- 检查进程是否存活 (kill -0)
|
|||
|
|
- 清理僵尸 PID 文件
|
|||
|
|
- 记录清理日志
|
|||
|
|
|
|||
|
|
permission_check:
|
|||
|
|
- 验证关键目录的写权限
|
|||
|
|
- 验证脚本自身的执行权限
|
|||
|
|
- 权限不足时给出明确提示
|
|||
|
|
|
|||
|
|
config_validation:
|
|||
|
|
- 检查 .env 文件存在性
|
|||
|
|
- 验证必需的环境变量
|
|||
|
|
- 缺失时从模板创建或提示用户
|
|||
|
|
|
|||
|
|
safe_mode:
|
|||
|
|
- 初始化失败时进入安全模式
|
|||
|
|
- 只启动基础功能
|
|||
|
|
- 提供修复建议
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**关键函数**:
|
|||
|
|
```bash
|
|||
|
|
init_system() # 系统初始化总入口
|
|||
|
|
init_directories() # 创建目录结构
|
|||
|
|
clean_stale_pids() # 清理过期 PID
|
|||
|
|
check_permissions() # 权限检查
|
|||
|
|
validate_config() # 配置验证
|
|||
|
|
enter_safe_mode() # 安全模式
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**实现要点**:
|
|||
|
|
- 使用 `mkdir -p` 确保父目录存在
|
|||
|
|
- 使用 `kill -0 $pid` 检查进程存活
|
|||
|
|
- 所有操作都要有错误处理
|
|||
|
|
- 记录所有自动修复的操作
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Layer 3: 参数化启动与非交互模式
|
|||
|
|
|
|||
|
|
**功能需求**:
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
requirements:
|
|||
|
|
command_line_args:
|
|||
|
|
options:
|
|||
|
|
- name: --silent / -s
|
|||
|
|
description: 静默模式,无交互提示
|
|||
|
|
effect: SILENT=1
|
|||
|
|
|
|||
|
|
- name: --force / -f
|
|||
|
|
description: 强制执行,自动确认
|
|||
|
|
effect: FORCE=1
|
|||
|
|
|
|||
|
|
- name: --no-banner
|
|||
|
|
description: 不显示 Banner
|
|||
|
|
effect: NO_BANNER=1
|
|||
|
|
|
|||
|
|
- name: --debug / -d
|
|||
|
|
description: 显示调试信息
|
|||
|
|
effect: DEBUG=1
|
|||
|
|
|
|||
|
|
- name: --help / -h
|
|||
|
|
description: 显示帮助信息
|
|||
|
|
effect: print_usage && exit 0
|
|||
|
|
|
|||
|
|
commands:
|
|||
|
|
- start: 启动服务
|
|||
|
|
- stop: 停止服务
|
|||
|
|
- restart: 重启服务
|
|||
|
|
- status: 显示状态
|
|||
|
|
- logs: 查看日志
|
|||
|
|
- diagnose: 系统诊断
|
|||
|
|
|
|||
|
|
execution_modes:
|
|||
|
|
interactive:
|
|||
|
|
- 显示彩色菜单
|
|||
|
|
- 等待用户输入
|
|||
|
|
- 操作后按回车继续
|
|||
|
|
|
|||
|
|
non_interactive:
|
|||
|
|
- 直接执行命令
|
|||
|
|
- 最小化输出
|
|||
|
|
- 返回明确的退出码 (0=成功, 1=失败)
|
|||
|
|
|
|||
|
|
exit_codes:
|
|||
|
|
- 0: 成功
|
|||
|
|
- 1: 一般错误
|
|||
|
|
- 2: 参数错误
|
|||
|
|
- 3: 依赖缺失
|
|||
|
|
- 4: 权限不足
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**关键函数**:
|
|||
|
|
```bash
|
|||
|
|
parse_arguments() # 解析命令行参数
|
|||
|
|
print_usage() # 显示帮助信息
|
|||
|
|
execute_command() # 执行非交互命令
|
|||
|
|
interactive_mode() # 交互式菜单
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**实现要点**:
|
|||
|
|
- 使用 `getopts` 或手动 `while [[ $# -gt 0 ]]` 解析参数
|
|||
|
|
- 参数和命令分离处理
|
|||
|
|
- 非交互模式禁用所有 `read` 操作
|
|||
|
|
- 明确的退出码便于 CI/CD 判断
|
|||
|
|
|
|||
|
|
**CI/CD 集成示例**:
|
|||
|
|
```bash
|
|||
|
|
# GitHub Actions
|
|||
|
|
./control.sh start --silent --force || exit 1
|
|||
|
|
|
|||
|
|
# Crontab
|
|||
|
|
0 2 * * * cd /path && ./control.sh restart --silent
|
|||
|
|
|
|||
|
|
# Systemd
|
|||
|
|
ExecStart=/path/control.sh start --silent
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Layer 4: 模块化插件系统
|
|||
|
|
|
|||
|
|
**功能需求**:
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
requirements:
|
|||
|
|
plugin_structure:
|
|||
|
|
directory: modules/
|
|||
|
|
naming: *.sh
|
|||
|
|
loading: 自动扫描并 source
|
|||
|
|
|
|||
|
|
plugin_interface:
|
|||
|
|
initialization:
|
|||
|
|
- 函数名: ${MODULE_NAME}_init()
|
|||
|
|
- 调用时机: 模块加载后立即执行
|
|||
|
|
- 用途: 注册命令、验证依赖
|
|||
|
|
|
|||
|
|
cleanup:
|
|||
|
|
- 函数名: ${MODULE_NAME}_cleanup()
|
|||
|
|
- 调用时机: 脚本退出前
|
|||
|
|
- 用途: 清理资源、保存状态
|
|||
|
|
|
|||
|
|
plugin_registry:
|
|||
|
|
- 维护已加载模块列表: LOADED_MODULES
|
|||
|
|
- 支持模块查询: list_modules()
|
|||
|
|
- 支持模块启用/禁用
|
|||
|
|
|
|||
|
|
plugin_dependencies:
|
|||
|
|
- 模块可声明依赖: REQUIRES=("curl" "jq")
|
|||
|
|
- 加载前检查依赖
|
|||
|
|
- 依赖缺失时跳过并警告
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**关键函数**:
|
|||
|
|
```bash
|
|||
|
|
load_modules() # 扫描并加载模块
|
|||
|
|
register_module() # 注册模块信息
|
|||
|
|
check_module_deps() # 检查模块依赖
|
|||
|
|
list_modules() # 列出已加载模块
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**模块模板**:
|
|||
|
|
```bash
|
|||
|
|
#!/bin/bash
|
|||
|
|
# modules/example.sh
|
|||
|
|
|
|||
|
|
MODULE_NAME="example"
|
|||
|
|
REQUIRES=("curl")
|
|||
|
|
|
|||
|
|
example_init() {
|
|||
|
|
log_info "Example module loaded"
|
|||
|
|
register_command "backup" "backup_database"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
backup_database() {
|
|||
|
|
log_info "Backing up database..."
|
|||
|
|
# 实现逻辑
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
example_init
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**实现要点**:
|
|||
|
|
- 使用 `for module in modules/*.sh` 扫描
|
|||
|
|
- 使用 `source $module` 加载
|
|||
|
|
- 加载失败不影响主程序
|
|||
|
|
- 支持模块间通信(通过全局变量或函数)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Layer 5: 监控、日志与诊断系统
|
|||
|
|
|
|||
|
|
**功能需求**:
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
requirements:
|
|||
|
|
logging_system:
|
|||
|
|
levels:
|
|||
|
|
- INFO: 一般信息(青色)
|
|||
|
|
- SUCCESS: 成功操作(绿色)
|
|||
|
|
- WARN: 警告信息(黄色)
|
|||
|
|
- ERROR: 错误信息(红色)
|
|||
|
|
- DEBUG: 调试信息(蓝色,需开启 --debug)
|
|||
|
|
|
|||
|
|
output:
|
|||
|
|
console:
|
|||
|
|
- 彩色输出(交互模式)
|
|||
|
|
- 纯文本(非交互模式)
|
|||
|
|
- 可通过 --silent 禁用
|
|||
|
|
|
|||
|
|
file:
|
|||
|
|
- 路径: logs/control.log
|
|||
|
|
- 格式: "时间戳 [级别] 消息"
|
|||
|
|
- 自动追加,不覆盖
|
|||
|
|
|
|||
|
|
rotation:
|
|||
|
|
- 检测日志大小
|
|||
|
|
- 超过阈值时轮转 (默认 10MB)
|
|||
|
|
- 保留格式: logfile.log.1, logfile.log.2
|
|||
|
|
- 可配置保留数量
|
|||
|
|
|
|||
|
|
process_monitoring:
|
|||
|
|
metrics:
|
|||
|
|
- PID: 进程 ID
|
|||
|
|
- CPU: CPU 使用率 (%)
|
|||
|
|
- Memory: 内存使用率 (%)
|
|||
|
|
- Uptime: 运行时长
|
|||
|
|
|
|||
|
|
collection:
|
|||
|
|
- 使用 ps 命令采集
|
|||
|
|
- 格式化输出
|
|||
|
|
- 支持多进程监控
|
|||
|
|
|
|||
|
|
system_diagnostics:
|
|||
|
|
collect_info:
|
|||
|
|
- 操作系统信息
|
|||
|
|
- Python 版本
|
|||
|
|
- 磁盘使用情况
|
|||
|
|
- 目录状态
|
|||
|
|
- 最近日志 (tail -n 10)
|
|||
|
|
- 进程状态
|
|||
|
|
|
|||
|
|
health_check:
|
|||
|
|
- 检查服务是否运行
|
|||
|
|
- 检查关键文件存在性
|
|||
|
|
- 检查磁盘空间
|
|||
|
|
- 检查内存使用
|
|||
|
|
- 返回健康状态和问题列表
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**关键函数**:
|
|||
|
|
```bash
|
|||
|
|
# 日志函数
|
|||
|
|
log_info() # 信息日志
|
|||
|
|
log_success() # 成功日志
|
|||
|
|
log_warn() # 警告日志
|
|||
|
|
log_error() # 错误日志
|
|||
|
|
log_debug() # 调试日志
|
|||
|
|
log_message() # 底层日志函数
|
|||
|
|
|
|||
|
|
# 日志管理
|
|||
|
|
rotate_logs() # 日志轮转
|
|||
|
|
clean_old_logs() # 清理旧日志
|
|||
|
|
|
|||
|
|
# 进程监控
|
|||
|
|
get_process_info() # 获取进程信息
|
|||
|
|
monitor_process() # 持续监控进程
|
|||
|
|
check_process_health() # 健康检查
|
|||
|
|
|
|||
|
|
# 系统诊断
|
|||
|
|
diagnose_system() # 完整诊断
|
|||
|
|
collect_system_info() # 收集系统信息
|
|||
|
|
generate_diagnostic_report() # 生成诊断报告
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**实现要点**:
|
|||
|
|
- ANSI 颜色码定义为常量
|
|||
|
|
- 使用 `tee -a` 同时输出到控制台和文件
|
|||
|
|
- `ps -p $pid -o %cpu=,%mem=,etime=` 获取进程信息
|
|||
|
|
- 诊断信息输出为结构化格式
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎨 用户界面设计
|
|||
|
|
|
|||
|
|
### Banner 设计
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
requirements:
|
|||
|
|
ascii_art:
|
|||
|
|
- 使用 ASCII 字符绘制
|
|||
|
|
- 宽度不超过 80 字符
|
|||
|
|
- 包含项目名称
|
|||
|
|
- 可选版本号
|
|||
|
|
|
|||
|
|
color_scheme:
|
|||
|
|
- 主色调: 青色 (CYAN)
|
|||
|
|
- 强调色: 绿色 (GREEN)
|
|||
|
|
- 警告色: 黄色 (YELLOW)
|
|||
|
|
- 错误色: 红色 (RED)
|
|||
|
|
|
|||
|
|
toggle:
|
|||
|
|
- 支持 --no-banner 禁用
|
|||
|
|
- 非交互模式自动禁用
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**示例**:
|
|||
|
|
```
|
|||
|
|
╔══════════════════════════════════════════════╗
|
|||
|
|
║ Enhanced Control Panel v2.0 ║
|
|||
|
|
╚══════════════════════════════════════════════╝
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 菜单设计
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
requirements:
|
|||
|
|
layout:
|
|||
|
|
- 清晰的分隔线
|
|||
|
|
- 数字编号选项
|
|||
|
|
- 彩色标识(绿色数字,白色文字)
|
|||
|
|
- 退出选项用红色
|
|||
|
|
|
|||
|
|
structure:
|
|||
|
|
main_menu:
|
|||
|
|
- 标题: "Main Menu" 或中文
|
|||
|
|
- 功能选项: 1-9
|
|||
|
|
- 退出选项: 0
|
|||
|
|
|
|||
|
|
sub_menu:
|
|||
|
|
- 返回主菜单: 0
|
|||
|
|
- 面包屑导航: 显示当前位置
|
|||
|
|
|
|||
|
|
interaction:
|
|||
|
|
- read -p "选择: " choice
|
|||
|
|
- 无效输入提示
|
|||
|
|
- 操作完成后 "按回车继续..."
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**示例**:
|
|||
|
|
```
|
|||
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|||
|
|
1) Start Service
|
|||
|
|
2) Stop Service
|
|||
|
|
3) Show Status
|
|||
|
|
0) Exit
|
|||
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔧 服务管理功能
|
|||
|
|
|
|||
|
|
### 核心操作
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
requirements:
|
|||
|
|
start_service:
|
|||
|
|
process:
|
|||
|
|
- 检查服务是否已运行
|
|||
|
|
- 已运行则提示并退出
|
|||
|
|
- 启动后台进程 (nohup ... &)
|
|||
|
|
- 保存 PID 到文件
|
|||
|
|
- 验证启动成功
|
|||
|
|
- 输出日志路径
|
|||
|
|
|
|||
|
|
error_handling:
|
|||
|
|
- 启动失败时清理 PID 文件
|
|||
|
|
- 记录错误日志
|
|||
|
|
- 返回非零退出码
|
|||
|
|
|
|||
|
|
stop_service:
|
|||
|
|
process:
|
|||
|
|
- 读取 PID 文件
|
|||
|
|
- 检查进程是否存在
|
|||
|
|
- 发送 SIGTERM 信号
|
|||
|
|
- 等待进程退出 (最多 30 秒)
|
|||
|
|
- 超时则发送 SIGKILL
|
|||
|
|
- 删除 PID 文件
|
|||
|
|
|
|||
|
|
error_handling:
|
|||
|
|
- PID 文件不存在时提示
|
|||
|
|
- 进程已死但 PID 存在时清理
|
|||
|
|
|
|||
|
|
restart_service:
|
|||
|
|
process:
|
|||
|
|
- 调用 stop_service
|
|||
|
|
- 等待 1-2 秒
|
|||
|
|
- 调用 start_service
|
|||
|
|
|
|||
|
|
status_check:
|
|||
|
|
display:
|
|||
|
|
- 服务状态: Running/Stopped
|
|||
|
|
- PID (如果运行)
|
|||
|
|
- CPU 使用率
|
|||
|
|
- 内存使用率
|
|||
|
|
- 运行时长
|
|||
|
|
- 日志文件大小
|
|||
|
|
- 最后一次启动时间
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### PID 文件管理
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
requirements:
|
|||
|
|
location: data/ 或 pids/
|
|||
|
|
naming: service_name.pid
|
|||
|
|
content: 单行纯数字 (进程 ID)
|
|||
|
|
|
|||
|
|
operations:
|
|||
|
|
create:
|
|||
|
|
- echo $! > "$PID_FILE"
|
|||
|
|
- 立即刷新到磁盘
|
|||
|
|
|
|||
|
|
read:
|
|||
|
|
- pid=$(cat "$PID_FILE")
|
|||
|
|
- 验证是否为数字
|
|||
|
|
|
|||
|
|
check:
|
|||
|
|
- kill -0 "$pid" 2>/dev/null
|
|||
|
|
- 返回 0 表示进程存活
|
|||
|
|
|
|||
|
|
cleanup:
|
|||
|
|
- rm -f "$PID_FILE"
|
|||
|
|
- 记录清理日志
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📂 项目结构规范
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
project_root/
|
|||
|
|
control.sh # 主控制脚本(本脚本)
|
|||
|
|
|
|||
|
|
modules/ # 可选插件目录
|
|||
|
|
database.sh # 数据库管理模块
|
|||
|
|
backup.sh # 备份模块
|
|||
|
|
monitoring.sh # 监控模块
|
|||
|
|
|
|||
|
|
data/ # 数据目录
|
|||
|
|
*.pid # PID 文件
|
|||
|
|
*.db # 数据库文件
|
|||
|
|
|
|||
|
|
logs/ # 日志目录
|
|||
|
|
control.log # 控制面板日志
|
|||
|
|
service.log # 服务日志
|
|||
|
|
|
|||
|
|
.venv/ # Python 虚拟环境(自动创建)
|
|||
|
|
|
|||
|
|
requirements.txt # Python 依赖(如需要)
|
|||
|
|
.env # 环境变量(如需要)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📝 代码规范与质量要求
|
|||
|
|
|
|||
|
|
### Shell 编码规范
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
requirements:
|
|||
|
|
shebang: "#!/bin/bash"
|
|||
|
|
|
|||
|
|
strict_mode:
|
|||
|
|
- set -e: 遇到错误立即退出
|
|||
|
|
- set -u: 使用未定义变量报错
|
|||
|
|
- set -o pipefail: 管道中任何命令失败则失败
|
|||
|
|
- 写法: set -euo pipefail
|
|||
|
|
|
|||
|
|
constants:
|
|||
|
|
- 全大写: RED, GREEN, CYAN
|
|||
|
|
- readonly 修饰: readonly RED='\033[0;31m'
|
|||
|
|
|
|||
|
|
variables:
|
|||
|
|
- 局部变量: local var_name
|
|||
|
|
- 全局变量: GLOBAL_VAR_NAME
|
|||
|
|
- 引用: "${var_name}" (总是加引号)
|
|||
|
|
|
|||
|
|
functions:
|
|||
|
|
- 命名: snake_case
|
|||
|
|
- 声明: function_name() { ... }
|
|||
|
|
- 返回值: return 0/1 或 echo result
|
|||
|
|
|
|||
|
|
comments:
|
|||
|
|
- 每个函数前注释功能
|
|||
|
|
- 复杂逻辑添加行内注释
|
|||
|
|
- 分隔符: # ===== Section =====
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 错误处理
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
requirements:
|
|||
|
|
command_check:
|
|||
|
|
- if ! command_exists python3; then
|
|||
|
|
- command -v cmd &> /dev/null
|
|||
|
|
|
|||
|
|
file_check:
|
|||
|
|
- if [ -f "$file" ]; then
|
|||
|
|
- if [ -d "$dir" ]; then
|
|||
|
|
|
|||
|
|
error_exit:
|
|||
|
|
- log_error "Error message"
|
|||
|
|
- exit 1 或 return 1
|
|||
|
|
|
|||
|
|
trap_signals:
|
|||
|
|
- trap cleanup_function EXIT
|
|||
|
|
- trap handle_sigint SIGINT
|
|||
|
|
- 确保资源清理
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 性能优化
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
requirements:
|
|||
|
|
avoid_subshells:
|
|||
|
|
- 优先使用 bash 内建命令
|
|||
|
|
- 避免不必要的 | 管道
|
|||
|
|
|
|||
|
|
cache_results:
|
|||
|
|
- 重复使用的值存储到变量
|
|||
|
|
- 避免重复调用外部命令
|
|||
|
|
|
|||
|
|
parallel_execution:
|
|||
|
|
- 独立任务使用 & 并行
|
|||
|
|
- 使用 wait 等待完成
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🧪 测试要求
|
|||
|
|
|
|||
|
|
### 手动测试清单
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
test_cases:
|
|||
|
|
initialization:
|
|||
|
|
- [ ] 首次运行自动创建目录
|
|||
|
|
- [ ] 首次运行自动安装依赖
|
|||
|
|
- [ ] 首次运行创建虚拟环境
|
|||
|
|
- [ ] 重复运行不重复初始化(幂等性)
|
|||
|
|
- [ ] 环境已存在时跳过创建,直接检查完整性
|
|||
|
|
- [ ] 依赖已安装时跳过安装,仅验证版本
|
|||
|
|
- [ ] 启动速度:二次启动明显快于首次(无重复安装)
|
|||
|
|
|
|||
|
|
interactive_mode:
|
|||
|
|
- [ ] Banner 正常显示
|
|||
|
|
- [ ] 菜单选项正确
|
|||
|
|
- [ ] 无效输入有提示
|
|||
|
|
- [ ] 每个菜单项都能执行
|
|||
|
|
|
|||
|
|
non_interactive_mode:
|
|||
|
|
- [ ] ./control.sh start --silent 成功启动
|
|||
|
|
- [ ] ./control.sh stop --silent 成功停止
|
|||
|
|
- [ ] ./control.sh status 正确显示状态
|
|||
|
|
- [ ] 错误返回非零退出码
|
|||
|
|
|
|||
|
|
service_management:
|
|||
|
|
- [ ] 启动服务创建 PID 文件
|
|||
|
|
- [ ] 停止服务删除 PID 文件
|
|||
|
|
- [ ] 重启服务正常工作
|
|||
|
|
- [ ] 状态显示准确
|
|||
|
|
|
|||
|
|
self_repair:
|
|||
|
|
- [ ] 删除目录后自动重建
|
|||
|
|
- [ ] 手动创建僵尸 PID 后自动清理
|
|||
|
|
- [ ] 权限不足时有明确提示
|
|||
|
|
|
|||
|
|
module_system:
|
|||
|
|
- [ ] 创建 modules/ 目录
|
|||
|
|
- [ ] 放入测试模块能自动加载
|
|||
|
|
- [ ] 模块函数可以调用
|
|||
|
|
|
|||
|
|
logging:
|
|||
|
|
- [ ] 日志文件正常创建
|
|||
|
|
- [ ] 日志包含时间戳和级别
|
|||
|
|
- [ ] 彩色输出正常显示
|
|||
|
|
- [ ] 日志轮转功能正常
|
|||
|
|
|
|||
|
|
edge_cases:
|
|||
|
|
- [ ] 无 sudo 权限时依赖检查跳过
|
|||
|
|
- [ ] Python 已安装时跳过安装
|
|||
|
|
- [ ] 虚拟环境已存在时不重建
|
|||
|
|
- [ ] 服务已运行时不重复启动
|
|||
|
|
- [ ] requirements.txt 依赖已满足时不执行 pip install
|
|||
|
|
- [ ] pip 版本已是最新时不执行升级
|
|||
|
|
- [ ] 部分依赖缺失时仅安装缺失部分,不重装全部
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 代码生成要求
|
|||
|
|
|
|||
|
|
### 输出格式
|
|||
|
|
|
|||
|
|
生成的脚本应该:
|
|||
|
|
1. **单文件**: 所有代码在一个 .sh 文件中
|
|||
|
|
2. **完整性**: 可以直接运行,无需额外文件
|
|||
|
|
3. **注释**: 关键部分有清晰注释
|
|||
|
|
4. **结构**: 使用注释分隔各个层级
|
|||
|
|
5. **定制区**: 标注 `👇 在这里添加你的逻辑` 供用户定制
|
|||
|
|
|
|||
|
|
### 代码结构模板
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
#!/bin/bash
|
|||
|
|
# ==============================================================================
|
|||
|
|
# 项目名称控制面板
|
|||
|
|
# ==============================================================================
|
|||
|
|
|
|||
|
|
set -euo pipefail
|
|||
|
|
|
|||
|
|
# ==============================================================================
|
|||
|
|
# LAYER 1: 环境检测与智能安装(按需安装,避免重复)
|
|||
|
|
# ==============================================================================
|
|||
|
|
|
|||
|
|
# 颜色定义
|
|||
|
|
readonly RED='\033[0;31m'
|
|||
|
|
# ... 其他颜色
|
|||
|
|
|
|||
|
|
# 路径定义
|
|||
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|||
|
|
# ... 其他路径
|
|||
|
|
|
|||
|
|
# 环境检测函数
|
|||
|
|
detect_environment() { ... }
|
|||
|
|
check_system_dependencies() { ... }
|
|||
|
|
check_venv_exists() { ... } # 检查虚拟环境是否存在
|
|||
|
|
verify_dependencies() { ... } # 验证依赖完整性
|
|||
|
|
smart_install_if_needed() { ... } # 智能安装:仅在检查失败时安装
|
|||
|
|
# ... 其他函数
|
|||
|
|
|
|||
|
|
# ==============================================================================
|
|||
|
|
# LAYER 2: 初始化与自修复
|
|||
|
|
# ==============================================================================
|
|||
|
|
|
|||
|
|
init_directories() { ... }
|
|||
|
|
clean_stale_pids() { ... }
|
|||
|
|
# ... 其他函数
|
|||
|
|
|
|||
|
|
# ==============================================================================
|
|||
|
|
# LAYER 3: 参数化启动
|
|||
|
|
# ==============================================================================
|
|||
|
|
|
|||
|
|
parse_arguments() { ... }
|
|||
|
|
print_usage() { ... }
|
|||
|
|
# ... 其他函数
|
|||
|
|
|
|||
|
|
# ==============================================================================
|
|||
|
|
# LAYER 4: 模块化插件系统
|
|||
|
|
# ==============================================================================
|
|||
|
|
|
|||
|
|
load_modules() { ... }
|
|||
|
|
# ... 其他函数
|
|||
|
|
|
|||
|
|
# ==============================================================================
|
|||
|
|
# LAYER 5: 监控与日志
|
|||
|
|
# ==============================================================================
|
|||
|
|
|
|||
|
|
log_info() { ... }
|
|||
|
|
get_process_info() { ... }
|
|||
|
|
# ... 其他函数
|
|||
|
|
|
|||
|
|
# ==============================================================================
|
|||
|
|
# 服务管理功能(用户定制区)
|
|||
|
|
# ==============================================================================
|
|||
|
|
|
|||
|
|
start_service() {
|
|||
|
|
log_info "Starting service..."
|
|||
|
|
# 👇 在这里添加你的启动逻辑
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
stop_service() {
|
|||
|
|
log_info "Stopping service..."
|
|||
|
|
# 👇 在这里添加你的停止逻辑
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# ==============================================================================
|
|||
|
|
# 交互式菜单
|
|||
|
|
# ==============================================================================
|
|||
|
|
|
|||
|
|
print_banner() { ... }
|
|||
|
|
show_menu() { ... }
|
|||
|
|
interactive_mode() { ... }
|
|||
|
|
|
|||
|
|
# ==============================================================================
|
|||
|
|
# 主入口
|
|||
|
|
# ==============================================================================
|
|||
|
|
|
|||
|
|
main() {
|
|||
|
|
parse_arguments "$@"
|
|||
|
|
init_system
|
|||
|
|
load_modules
|
|||
|
|
|
|||
|
|
if [ -n "$COMMAND" ]; then
|
|||
|
|
execute_command "$COMMAND"
|
|||
|
|
else
|
|||
|
|
interactive_mode
|
|||
|
|
fi
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
main "$@"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔍 验收标准
|
|||
|
|
|
|||
|
|
### 功能完整性
|
|||
|
|
|
|||
|
|
- ✅ 包含全部 5 个层级的功能
|
|||
|
|
- ✅ 支持交互式和非交互式两种模式
|
|||
|
|
- ✅ 实现所有核心服务管理功能
|
|||
|
|
- ✅ 包含完整的日志和监控系统
|
|||
|
|
|
|||
|
|
### 代码质量
|
|||
|
|
|
|||
|
|
- ✅ 通过 shellcheck 检查(无错误)
|
|||
|
|
- ✅ 符合 Bash 编码规范
|
|||
|
|
- ✅ 所有函数有错误处理
|
|||
|
|
- ✅ 变量正确引用(加引号)
|
|||
|
|
|
|||
|
|
### 可用性
|
|||
|
|
|
|||
|
|
- ✅ 首次运行即可使用(自动初始化)
|
|||
|
|
- ✅ 后续运行快速启动(智能检查,无重复安装)
|
|||
|
|
- ✅ 幂等性验证通过(重复运行不改变已有环境)
|
|||
|
|
- ✅ 帮助信息清晰(--help)
|
|||
|
|
- ✅ 错误提示明确
|
|||
|
|
- ✅ 操作反馈及时
|
|||
|
|
|
|||
|
|
### 可维护性
|
|||
|
|
|
|||
|
|
- ✅ 代码结构清晰
|
|||
|
|
- ✅ 函数职责单一
|
|||
|
|
- ✅ 易于添加新功能
|
|||
|
|
- ✅ 支持模块化扩展
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📚 附加要求
|
|||
|
|
|
|||
|
|
### 文档输出
|
|||
|
|
|
|||
|
|
生成脚本后,同时生成:
|
|||
|
|
1. **README.md** - 快速开始指南
|
|||
|
|
2. **模块示例** - modules/example.sh
|
|||
|
|
3. **使用说明** - 如何定制脚本
|
|||
|
|
|
|||
|
|
### 示例场景
|
|||
|
|
|
|||
|
|
提供以下场景的实现示例:
|
|||
|
|
1. **Python 应用**: 启动 Flask/Django 应用
|
|||
|
|
2. **Node.js 应用**: 启动 Express 应用
|
|||
|
|
3. **数据库**: 启动/停止 PostgreSQL
|
|||
|
|
4. **容器化**: 启动 Docker 容器
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🚀 使用示例
|
|||
|
|
|
|||
|
|
### 基本使用
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 首次运行(自动配置环境:安装依赖、创建虚拟环境)
|
|||
|
|
./control.sh --force
|
|||
|
|
|
|||
|
|
# 后续运行(智能检查:仅验证环境,不重复安装,启动快速)
|
|||
|
|
./control.sh
|
|||
|
|
|
|||
|
|
# 交互式菜单
|
|||
|
|
./control.sh
|
|||
|
|
|
|||
|
|
# 命令行模式
|
|||
|
|
./control.sh start --silent
|
|||
|
|
./control.sh status
|
|||
|
|
./control.sh stop --silent
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### CI/CD 集成
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
# GitHub Actions
|
|||
|
|
- name: Deploy
|
|||
|
|
run: |
|
|||
|
|
chmod +x control.sh
|
|||
|
|
./control.sh start --silent --force
|
|||
|
|
./control.sh status || exit 1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Systemd 集成
|
|||
|
|
|
|||
|
|
```ini
|
|||
|
|
[Service]
|
|||
|
|
ExecStart=/path/to/control.sh start --silent
|
|||
|
|
ExecStop=/path/to/control.sh stop --silent
|
|||
|
|
Restart=on-failure
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 💡 定制指南
|
|||
|
|
|
|||
|
|
### 最小修改清单
|
|||
|
|
|
|||
|
|
用户只需修改以下 3 处即可使用:
|
|||
|
|
|
|||
|
|
1. **项目路径**(可选)
|
|||
|
|
```bash
|
|||
|
|
PROJECT_ROOT="${SCRIPT_DIR}"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **启动逻辑**
|
|||
|
|
```bash
|
|||
|
|
start_service() {
|
|||
|
|
# 👇 添加你的启动命令
|
|||
|
|
nohup python3 app.py >> logs/app.log 2>&1 &
|
|||
|
|
echo $! > data/app.pid
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **停止逻辑**
|
|||
|
|
```bash
|
|||
|
|
stop_service() {
|
|||
|
|
# 👇 添加你的停止命令
|
|||
|
|
kill $(cat data/app.pid)
|
|||
|
|
rm -f data/app.pid
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎓 补充说明
|
|||
|
|
|
|||
|
|
### 命名约定
|
|||
|
|
|
|||
|
|
- **脚本名称**: `control.sh` 或 `项目名-control.sh`
|
|||
|
|
- **PID 文件**: `service_name.pid`
|
|||
|
|
- **日志文件**: `control.log`, `service.log`
|
|||
|
|
- **模块文件**: `modules/功能名.sh`
|
|||
|
|
|
|||
|
|
### 配置优先级
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1. 命令行参数 (最高优先级)
|
|||
|
|
2. 环境变量
|
|||
|
|
3. .env 文件
|
|||
|
|
4. 脚本内默认值 (最低优先级)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 安全建议
|
|||
|
|
|
|||
|
|
- ❌ 不要在脚本中硬编码密码、Token
|
|||
|
|
- ✅ 使用 .env 文件管理敏感信息
|
|||
|
|
- ✅ .env 文件添加到 .gitignore
|
|||
|
|
- ✅ 限制脚本权限 (chmod 750)
|
|||
|
|
- ✅ 验证用户输入(防止注入)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ 生成清单
|
|||
|
|
|
|||
|
|
生成完成后,应交付:
|
|||
|
|
|
|||
|
|
1. **control.sh** - 主控制脚本(400-500 行)
|
|||
|
|
2. **README.md** - 使用说明
|
|||
|
|
3. **modules/example.sh** - 模块示例(可选)
|
|||
|
|
4. **.env.example** - 环境变量模板(可选)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**版本**: v2.0
|
|||
|
|
**最后更新**: 2025-11-07
|
|||
|
|
**兼容性**: Bash 4.0+, Ubuntu/CentOS/macOS
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📝 提示词使用方法
|
|||
|
|
|
|||
|
|
将本文档作为提示词提供给 AI 时,使用以下格式:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
请根据《生产级 Shell 控制面板生成规格说明》生成一个控制面板脚本。
|
|||
|
|
|
|||
|
|
项目信息:
|
|||
|
|
- 项目名称: [你的项目名称]
|
|||
|
|
- 用途: [描述项目用途]
|
|||
|
|
- 主要功能: [列出需要的主要功能]
|
|||
|
|
|
|||
|
|
特殊要求:
|
|||
|
|
- [列出任何额外的特殊要求]
|
|||
|
|
|
|||
|
|
请严格按照规格说明中的 5 层架构实现,确保所有功能完整且可用。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**注意**: 本规格说明经过实战验证,覆盖了生产环境 99% 的常见需求。严格遵循本规格可生成高质量、可维护的控制面板脚本。
|