# sms-scheduler **Repository Path**: Allen_2017/sms-scheduler ## Basic Information - **Project Name**: sms-scheduler - **Description**: 访客登记短信调度脚本 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-26 - **Last Updated**: 2025-12-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 短信调度服务 (SMS Scheduler) 一个基于Node.js + PM2的长时间运行短信调度服务,支持定时获取数据、动态提取手机号码并发送短信通知。 ## 1、功能特性 - ✅ **长时间稳定运行**: 使用PM2进程管理器,支持自动重启和故障恢复 - ✅ **动态手机号码提取**: 从API响应数据中自动提取手机号码,支持复杂的嵌套结构 - ✅ **定时任务调度**: 支持灵活的cron表达式配置 - ✅ **自动重试机制**: 数据获取和短信发送失败时自动重试 - ✅ **按日期分割日志**: 每天自动生成新的日志文件,支持日志轮转和自动清理 - ✅ **模块化架构**: 配置与业务逻辑分离,便于维护和扩展 - ✅ **环境变量配置**: 支持通过环境变量灵活配置所有参数 - ✅ **健康检查**: 内置健康检查机制,确保服务正常运行 - ✅ **优雅关闭**: 支持优雅关闭,确保任务完整执行 - ✅ **Windows集成**: 提供批处理脚本,方便Windows用户使用 ## 2、系统要求 - Windows/Linux/macOS - Node.js 14.0.0 或更高版本 - 网络连接(用于API调用) ## 3、项目文件结构 ``` sms/ ├── package.json # 项目配置和依赖 ├── config.js # 应用程序配置文件 ├── logger.js # 日志管理模块 ├── app.js # 主应用程序 ├── ecosystem.config.js # PM2配置文件 ├── start.bat # Windows启动脚本 ├── stop.bat # Windows停止脚本 ├── .env.example # 环境变量配置模板 └── README.md # 详细说明文档 ``` ## 4、架构设计 ### 4.1、模块化设计 - **config.js** - 集中管理所有配置项,支持环境变量和配置验证 - **logger.js** - 专业日志管理模块,支持按日期分割、自动轮转和清理 - **app.js** - 核心业务逻辑,分为数据处理、API客户端、健康检查等模块 ### 4.2、工作流程 1. **定时触发** - 根据cron表达式定时执行任务 2. **健康检查** - 检查网络连接和系统状态 3. **数据获取** - 调用配置的API获取数据 4. **号码提取** - 从响应数据中动态提取手机号码 5. **内容生成** - 根据模板生成个性化短信内容 6. **批量发送** - 分批并发发送短信,避免API限制 7. **结果统计** - 记录发送结果和性能指标 ## 5、测试环境 ### 5.1、免费测试接口 如果您想先测试应用程序功能,可以使用以下免费接口: #### 5.1.1、数据获取测试接口 推荐使用 **JSONPlaceholder**: - URL: `https://jsonplaceholder.typicode.com/users` - 功能:返回用户列表,包含手机号码 - 无需认证,完全免费 #### 5.1.2、短信发送测试接口 推荐使用 **Webhook.site**: 1. 访问 https://webhook.site/ 2. 复制生成的唯一URL 3. 在配置中设置该URL作为短信接口 - 功能:接收并显示您发送的所有HTTP请求 - 无需认证,完全免费 - 支持查看请求头、请求体等详细信息 ### 5.2、API独立测试(可选) 在完整部署前,可以使用独立的API测试脚本验证接口: ```bash # 运行API测试 node test-apis.js ``` **此脚本功能:** - ✅ 独立测试数据获取API(JSONPlaceholder) - ✅ 独立测试短信发送API(Webhook.site) - ✅ 提取并展示手机号码示例 - ✅ 提供详细的配置指导 - ✅ 不依赖PM2或完整应用环境 **测试输出示例:** ``` 🧪 开始API测试... ======================================== 🔍 测试数据获取API... URL: https://jsonplaceholder.typicode.com/users ✅ 数据API测试成功! 状态码: 200 用户数量: 10 📱 提取的手机号码示例: 1. Leanne Graham: 1-770-736-8031 2. Ervin Howell: 010-692-6593 x09125 📤 测试短信发送API... ⚠️ 注意:请先将SMS_API_URL替换为您的Webhook URL ``` ### 5.3、一键测试设置 **Windows用户:** ```bash # 运行测试环境设置脚本 test-setup.bat # 然后配置Webhook URL(按脚本提示) notepad .env # 启动测试 start.bat ``` **Linux/macOS用户:** ```bash # 运行测试环境设置脚本 ./test-setup.sh # 配置Webhook URL nano .env # 启动测试 npm run pm2:start ``` ### 5.3、测试配置说明 测试环境配置(.env.test): - **执行频率**:每30秒一次(便于快速验证) - **数据源**:JSONPlaceholder用户API - **手机号码提取**:从用户列表中提取phone字段 - **短信接口**:Webhook.site - **启动执行**:启动时立即执行一次 ### 5.4、验证测试结果 1. **查看日志**: ```bash tail -f logs/app-$(date +%Y-%m-%d).log ``` 2. **检查Webhook**: - 访问您的Webhook URL - 查看接收到的请求内容 - 验证短信数据格式、请求头、请求体等 3. **PM2监控**: ```bash pm2 monit ``` ## 6、快速开始 ### 6.1. 环境准备 1. **安装Node.js** ``` 从官网下载: https://nodejs.org/ 选择LTS版本进行安装 ``` 2. **验证安装** ```bash node --version npm --version ``` ### 6.2. 项目部署 1. **下载项目文件** ``` 将所有项目文件复制到目标目录,例如: C:\sms-scheduler\ 或 /home/user/sms-scheduler/ ``` 2. **配置环境变量** ```bash # 复制环境变量模板文件 copy .env.example .env # Windows cp .env.example .env # Linux/macOS # 编辑 .env 文件,填入实际的配置信息 notepad .env # Windows nano .env # Linux/macOS ``` 3. **一键启动** ```bash # Windows: 双击运行启动脚本 start.bat # Linux/macOS: 使用PM2启动 npm run pm2:start ``` ### 6.3. 验证运行 启动成功后,可以通过以下方式验证: 1. **查看进程状态** ```bash pm2 status ``` 2. **查看实时日志** ```bash pm2 logs sms-scheduler # 或查看按日期分割的日志文件 tail -f logs/app-$(date +%Y-%m-%d).log ``` 3. **查看监控面板** ```bash pm2 monit ``` ## 7、配置说明 ### 7.1、核心配置项 | 配置类别 | 环境变量 | 说明 | 示例 | |----------|----------|------|------| | **数据API** | `DATA_API_URL` | 数据获取接口地址 | `https://api.example.com/data` | | **数据API** | `DATA_API_TOKEN` | 数据接口认证Token | `Bearer abc123token` | | **短信API** | `SMS_API_URL` | 短信发送接口地址 | `https://sms.example.com/send` | | **短信API** | `SMS_API_TOKEN` | 短信接口认证Token | `Bearer xyz789token` | | **定时任务** | `CRON_EXPRESSION` | 定时任务表达式 | `*/5 * * * *` | | **号码提取** | `PHONE_NUMBER_PATH` | 手机号码字段路径 | `phoneNumbers` | | **内容提取** | `DATA_PATH` | 数据内容字段路径 | `data` | ### 7.2、手机号码提取配置 支持复杂的嵌套结构提取: ```bash # 简单字段 PHONE_NUMBER_PATH=phoneNumbers # 嵌套对象 PHONE_NUMBER_PATH=data.phoneNumbers # 数组中的字段 PHONE_NUMBER_PATH=users[*].phone # 多层嵌套 PHONE_NUMBER_PATH=result.contacts[*].mobile ``` ### 7.3、API响应数据示例 **示例1:简单结构** ```json { "status": "success", "phoneNumbers": ["13800138000", "13900139000"], "data": { "message": "系统正常运行", "timestamp": "2024-01-01T12:00:00Z" } } ``` 配置: ```bash PHONE_NUMBER_PATH=phoneNumbers DATA_PATH=data ``` **示例2:复杂嵌套** ```json { "code": 200, "result": { "users": [ {"name": "张三", "phone": "13800138000"}, {"name": "李四", "phone": "13900139000"} ], "info": "有新的订单需要处理" } } ``` 配置: ```bash PHONE_NUMBER_PATH=result.users[*].phone DATA_PATH=result.info ``` ### 7.4、Cron表达式示例 | 表达式 | 说明 | |--------|------| | `*/1 * * * *` | 每分钟执行 | | `*/5 * * * *` | 每5分钟执行 | | `0 */2 * * *` | 每2小时执行 | | `0 9 * * *` | 每天上午9点执行 | | `0 9,18 * * *` | 每天上午9点和下午6点执行 | | `0 9 * * 1-5` | 工作日上午9点执行 | ### 7.5、短信模板配置 支持以下占位符: - `{data}` - 从API提取的数据内容 - `{phoneNumbers}` - 手机号码列表 - `{time}` - 当前时间(中文格式) - `{date}` - 当前日期 示例模板: ```bash SMS_TEMPLATE=数据更新通知:{data} 时间:{time} ``` ## 8、常用命令 ### 8.1、PM2 基础命令 ```bash # 启动服务 npm run pm2:start # 停止服务 npm run pm2:stop # 重启服务 npm run pm2:restart # 查看日志 npm run pm2:logs # 监控面板 npm run pm2:monit # 删除服务 npm run pm2:delete ``` ### 8.2、Windows 批处理脚本 ```bash # 启动服务 start.bat # 停止服务 stop.bat ``` ### 8.3、Linux/macOS Shell 脚本 ```bash # 启动服务 ./start.sh # 停止服务 ./stop.sh ``` ## 9、日志管理 ### 9.1、日志文件结构 ``` logs/ ├── app-2024-01-01.log # 2024年1月1日的日志 ├── app-2024-01-02.log # 2024年1月2日的日志 ├── app-2024-01-03.log # 2024年1月3日的日志 └── ... ``` ### 9.2、日志特性 - **按日期分割**: 每天自动创建新的日志文件 - **自动轮转**: 单个文件超过大小限制时自动轮转 - **自动清理**: 超过保留天数的日志文件自动删除 - **性能监控**: 记录API调用耗时和任务执行时间 - **安全脱敏**: 日志中的手机号码自动脱敏显示 ### 9.3、查看日志 ```bash # 查看今天日志 tail -f logs/app-$(date +%Y-%m-%d).log # 查看指定日期日志 tail -f logs/app-2024-01-01.log # 查看错误日志 grep ERROR logs/app-$(date +%Y-%m-%d).log # 查看短信发送记录 grep "短信发送" logs/app-$(date +%Y-%m-%d).log ``` ## 10、Windows 部署指南 ### 10.1、部署方式选择 Windows环境提供了三种部署方式: | 部署方式 | 适用场景 | 优点 | 缺点 | |---------|---------|------|------| | **PM2 + 批处理** | 开发测试、快速部署 | 简单易用、功能丰富 | 需要保持命令窗口运行 | | **Windows服务** | 生产环境、长期运行 | 系统级服务、自动重启 | 配置复杂、需要管理员权限 | | **任务计划程序** | 定时执行、简单需求 | 系统原生、无需额外软件 | 监控能力弱、重启困难 | ### 10.2、方式一:PM2 + 批处理脚本(推荐用于开发测试) **脚本文件说明** - `start.bat` - 启动服务脚本 - `stop.bat` - 停止服务脚本 - `install-service.bat` - Windows服务安装脚本 - `uninstall-service.bat` - Windows服务卸载脚本 **快速启动** ```bash # 启动服务 双击 start.bat 或在命令行执行: start.bat # 停止服务 双击 stop.bat 或在命令行执行: stop.bat ``` **start.bat 脚本功能** - ✅ 自动检查Node.js环境 - ✅ 自动安装npm依赖 - ✅ 自动安装PM2(支持局部和全局安装) - ✅ 创建日志目录 - ✅ 停止现有进程避免冲突 - ✅ 启动服务并显示状态 - ✅ 提供常用命令提示 **stop.bat 脚本功能** - ✅ 分步骤清理:PM2进程 → PM2守护进程 → 独立Node.js进程 - ✅ 使用Windows原生命令:`tasklist`、`taskkill` - ✅ 验证清理效果 - ✅ 提供手动处理建议 **执行权限问题解决** 如果遇到执行权限问题: 1. **解除文件锁定** ``` 右键点击 .bat 文件 → 属性 → 常规 → 解除锁定 ``` 2. **以管理员身份运行** ``` 右键点击 .bat 文件 → 以管理员身份运行 ``` 3. **修改Windows安全策略** ``` Windows设置 → 更新和安全 → Windows安全���心 → 病毒和威胁防护 → 管理设置 → 添加排除项 → 添加文件夹(项目目录) ``` 4. **PowerShell执行策略** ```powershell # 以管理员身份运行PowerShell Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser ``` ### 10.3、方式二:Windows服务(推荐用于生产环境) **系统要求** - Windows Server 2012+ 或 Windows 10+ - 管理员权限 - Node.js 14.0+ **安装步骤** 1. **以管理员身份运行安装脚本** ```bash # 右键点击 install-service.bat → 以管理员身份运行 install-service.bat ``` 2. **验证服务安装** - 打开服务管理器:`services.msc` - 查找服务:`SMS Scheduler Service` - 确认状态为"正在运行" 3. **服务管理命令** ```cmd # 查看服务状态 sc query "SMS Scheduler Service" # 启动服务 net start "SMS Scheduler Service" # 停止服务 net stop "SMS Scheduler Service" # 重启服务 net stop "SMS Scheduler Service" && net start "SMS Scheduler Service" # 删除服务(需要管理员权限) sc delete "SMS Scheduler Service" ``` **服务特性** - 🔄 **自动重启**:服务异常退出时自动重启 - 🚀 **系统启动**:随系统自动启动 - 📊 **事件日志**:集成Windows事件查看器 - 🔒 **权限控制**:可指定运行用户和权限 - 📈 **性能监控**:可通过性能监视器监控 **卸载Windows服务** ```bash # 以管理员身份运行卸载脚本 uninstall-service.bat ``` ### 10.4、方式三:Windows任务计划程序 **创建基本任务** 1. **打开任务计划程序** ``` Win + R → taskschd.msc → 回车 ``` 2. **创建任务** - 名称:`SMS Scheduler Task` - 描述:`定时发送短信任务` 3. **设置触发器** - 任务开始时:`系统启动时` - 重复任务间隔:`5分钟` - 停止任务:`如果任务运行时间超过3小时则停止` 4. **设置操作** - 操作:`启动程序` - 程序或脚本:`C:\Program Files\nodejs\node.exe` - 添加参数:`C:\path\to\your\project\app.js` - 起始于:`C:\path\to\your\project\` 5. **设置条件** - ✅ 只有在计算机连接到网络时才启动 - ✅ 如果计算机使用交流电源,则启动任务 - ✅ 如果任务失败,按以下频率重新启动:1分钟 **任务管理命令** ```cmd # 查看任务列表 schtasks /query /fo LIST | findstr SMS # 立即运行任务 schtasks /run /tn "SMS Scheduler Task" # 停止任务 schtasks /end /tn "SMS Scheduler Task" # 删除任务 schtasks /delete /tn "SMS Scheduler Task" /f ``` ### 10.5、故障排除 **Windows服务相关问题** 1. **服务安装失败** ``` 解决方案: - 确认以管理员身份运行 - 检查node-windows是否正确安装 - 确认防病毒软件未阻止安装 - 查看Windows事件查看器错误日志 ``` 2. **服务无法启动** ``` 解决方案: - 检查服务日志文件权限 - 确认Node.js路径正确 - 验证环境变量配置 - 检查端口占用情况 ``` 3. **服务频繁重启** ``` 解决方案: - 检查应用程序错误 - 增加内存限制 - 检查日志文件写入权限 - 验证配置文件正确性 ``` **批处理脚本问题** 1. **命令执行权限被拒绝** ``` 解决方案: - 以管理员身份运行 - 添加到Windows Defender排除列表 - 修改组策略:用户账户控制 → 降低权限级别 ``` 2. **PM2全局安装失败** ``` 解决方案: - 使用局部安装:npm install pm2 - 配置npm全局路径:npm config set prefix - 检查网络连接和npm源 ``` 3. **进程无法完全停止** ``` 解决方案: - 使用改进后的stop.bat脚本 - 手动使用任务管理器结束进程 - 重启系统作为最后手段 ``` ### 10.6、监控和维护 **Windows服务监控** - **事件查看器**:`eventvwr.msc` - **服务管理器**:`services.msc` - **性能监视器**:`perfmon.msc` - **任务管理器**:`taskmgr.msc` **日志查看** ```cmd # 查看应用程序日志 type logs\app-YYYY-MM-DD.log # 实时监控日志 powershell Get-Content logs\app-*.log -Wait -Tail 20 # 查看错误日志 findstr "ERROR" logs\app-*.log ``` ## 11、设置开机自启 ### 11.1、方法三:Linux Systemd服务 ```bash # 创建systemd服���文件 sudo nano /etc/systemd/system/sms-scheduler.service # 服务配置内容 [Unit] Description=SMS Scheduler Service After=network.target [Service] Type=forking User=your-username WorkingDirectory=/path/to/sms-scheduler ExecStart=/usr/local/bin/pm2 start ecosystem.config.js --env production ExecReload=/usr/local/bin/pm2 reload ecosystem.config.js --env production ExecStop=/usr/local/bin/pm2 stop ecosystem.config.js Restart=always [Install] WantedBy=multi-user.target # 启用服务 sudo systemctl enable sms-scheduler.service sudo systemctl start sms-scheduler.service ``` ## 12、监控和维护 ### 12.1、健康检查 应用程序内置健康检查功能: - 检查网络连接 - 验证日志文件写入权限 - 自动跳过异常任务执行 ### 12.2、性能监控 使用PM2监控面板: ```bash pm2 monit ``` 可以看到: - CPU使用率 - 内存占用 - 启动时间 - 重启次数 - 实时日志 ### 12.3、日志分析 查看最近错误: ```bash pm2 logs sms-scheduler --err --lines 50 ``` 查看所有日志: ```bash pm2 logs sms-scheduler --lines 100 ``` 查看日志统计: ```bash node -e "const logger = require('./logger'); console.log(logger.getLogStats())" ``` ## 13、故障排除 ### 13.1、常见问题 1. **服务无法启动** ``` 解决方案: - 检查Node.js版本 - 确认网络连接 - 查看错误日志:pm2 logs sms-scheduler --err - 验证配置文件:node -e "require('./config').validateConfig()" ``` 2. **API调用失败** ``` 解决方案: - 检查API地址是否正确 - 验证Token是否有效 - 确认网络可访问API服务器 - 检查API响应格式是否符合预期 ``` 3. **手机号码提取失败** ``` 解决方案: - 检查PHONE_NUMBER_PATH配置是否正确 - 验证API响应数据结构 - 查看日志中的数据提取过程 - 使用测试数据验证路径配置 ``` 4. **短信发送失败** ``` 解决方案: - 检查短信接口配置 - 验证手机号码格式 - 确认短信服务商账户状态 - 检查短信内容是否符合规范 ``` 5. **定时任务不执行** ``` 解决方案: - 检查cron表达式格式 - 确认系统时间正确 - 查看PM2进程状态 - 检查健康检查是否通过 ``` ==========================================分割线============================================= ## 彻底清理进程指南 在生产环境中,可能会遇到进程无法正常停止、配置更新不生效、或者多个进程实例同时运行的复杂情况。本指南提供了一套完整的进程清理方法。 ### 使用场景 当出现以下情况时,建议使用本清理流程: 1. **配置更新不生效**:修改了.env文件但应用程序仍在使用旧配置 2. **多个进程实例**:发现多个sms-scheduler进程同时运行 3. **PM2命令无效**:PM2 stop/restart命令无法正常停止进程 4. **端口占用**:应用程序端口被其他进程占用 5. **内存泄漏**:进程内存占用持续增长 6. **异常重启**:进程不断重启或行为异常 7. **部署更新**:需要完全清理旧版本再部署新版本 ### 第一步:全面排查进程 #### 1.1 查看PM2管理的进程 ```bash # 查看PM2进程状态 pm2 status pm2 list # 查看详细的进程信息 pm2 show sms-scheduler # 查看PM2守护进程状态 pm2 status --watch ``` #### 1.2 查找所有相关进程(重要!) ```bash # 查找所有Node.js进程 ps aux | grep -E "(node|app\.js|sms)" | grep -v grep # 查找所有SMS相关进程 ps aux | grep sms | grep -v grep # 查找所有app.js进程 ps aux | grep app.js | grep -v grep # 查找特定用户的所有Node.js进程 ps aux | grep -E "(node|npm|pm2)" | grep yuanchao | grep -v grep ``` **预期输出示例:** ``` yuanchao 54132 0.0 0.2 37081452 54636 ?? S 1:00上午 0:01.34 node /Users/.../sms/node_modules/.bin/pm2 logs sms-scheduler yuanchao 42469 0.0 0.3 47608356 96924 ?? S 11:05下午 0:24.94 sms-scheduler yuanchao 31757 0.0 0.3 47476516 92420 ?? S 10:58下午 0:07.10 sms-scheduler ``` #### 1.3 检查端口占用情况 ```bash # 查看端口占用(如果应用使用特定端口) lsof -i :3000 netstat -tulpn | grep :3000 # 查看所有监听端口 netstat -tulpn ``` ### 第二步:强制停止所有进程 #### 2.1 停止PM2管理的进程 ```bash # 优雅停止PM2进程 pm2 stop sms-scheduler # 如果优雅停止失败,强制删除 pm2 delete sms-scheduler # 停止所有PM2进程 pm2 stop all # 删除所有PM2进程 pm2 delete all ``` #### 2.2 强制杀死PM2守护进程 ```bash # 彻底杀死PM2守护进程 pm2 kill # 验证PM2守护进程是否被杀死 ps aux | grep pm2 | grep -v grep ``` #### 2.3 手动杀死残留进程 **⚠️ 警告:此步骤将强制终止进程,可能导致任务中断,请在非业务高峰期执行** ```bash # 获取需要杀死的进程PID ps aux | grep -E "(sms|app\.js)" | grep -v grep # 强制杀死指定进程(将PID替换为实际的进程ID) kill -9 42469 31757 21434 91159 # 如果进程名包含特定字符,可以批量杀死 pkill -f "sms-scheduler" pkill -f "app.js" pkill -f "node.*sms" # 强制杀死所有相关Node.js进程(谨慎使用!) pkill -9 -f "node.*sms" ``` #### 2.4 验证进程清理结果 ```bash # 再次检查进程列表 ps aux | grep -E "(node|app\.js|sms)" | grep -v grep # 确认没有相关进程在运行 ps aux | grep sms | grep -v grep ``` ### 第三步:清理临时文件和缓存 #### 3.1 清理日志文件 ```bash # 备份重要日志(可选) mkdir -p backup/$(date +%Y%m%d_%H%M%S) cp -r logs/ backup/$(date +%Y%m%d_%H%M%S)/ # 删除所有日志文件 rm -rf logs/* # 删除PM2日志 rm -rf ~/.pm2/logs/ # 清理系统临时文件 rm -rf /tmp/sms-* ``` #### 3.2 清理PM2缓存和状态 ```bash # 清理PM2状态文件 rm -rf ~/.pm2/dump.pm2 rm -rf ~/.pm2/pm2.pid rm -rf ~/.pm2/rpc.sock rm -rf ~/.pm2/pub.sock # 重新初始化PM2 pm2 kill pm2 startup ``` #### 3.3 清理Node.js缓存 ```bash # 清理npm缓存 npm cache clean --force # 清理Node.js模块缓存(谨慎使用) rm -rf node_modules/.cache/ ``` ### 第四步:重新启动服务 #### 4.1 验证环境准备 ```bash # 检查Node.js版本 node --version # 检查环境配置 cat .env | head -10 # 验证配置文件 node -e "require('./config').validateConfig()" # 检查日志目录权限 ls -la logs/ ``` #### 4.2 启动PM2服务 ```bash # 启动PM2守护进程 pm2 start ecosystem.config.js # 检查启动状态 pm2 status pm2 list # 查看启动日志 pm2 logs sms-scheduler --lines 20 ``` #### 4.3 验证服务正常运行 ```bash # 检查进程状态 pm2 monit # 查看实时日志 tail -f logs/app-$(date +%Y-%m-%d).log # 检查API调用 curl -I http://localhost:3000/health # 如果有健康检查接口 ``` ### 第五步:问题排查工具 #### 5.1 进程监控脚本 创建一个监控脚本 `monitor-processes.sh`: ```bash #!/bin/bash echo "=== 进程监控报告 ===" echo "时间: $(date)" echo "" echo "=== PM2进程状态 ===" pm2 status echo "" echo "=== 所有相关进程 ===" ps aux | grep -E "(node|app\.js|sms)" | grep -v grep echo "" echo "=== 端口占用情况 ===" netstat -tulpn | grep -E ":(3000|8080|80)" || echo "无端口占用" echo "" echo "=== 内存使用情况 ===" ps aux | grep -E "(sms|app\.js)" | awk '{print $4, $11}' | sort -nr echo "" echo "=== 磁盘使用情况 ===" du -sh logs/ 2>/dev/null || echo "日志目录不存在" echo "" ``` #### 5.2 自动清理脚本 创建一个自动清理脚本 `cleanup-processes.sh`: ```bash #!/bin/bash set -e echo "开始清理SMS调度服务进程..." echo "时间: $(date)" # 停止PM2 echo "1. 停止PM2服务..." pm2 stop all || true pm2 delete all || true pm2 kill || true # 杀死残留进程 echo "2. 清理残留进程..." PIDS=$(ps aux | grep -E "(sms|app\.js)" | grep -v grep | awk '{print $2}') if [ ! -z "$PIDS" ]; then echo "发现残留进程: $PIDS" echo "$PIDS" | xargs kill -9 fi # 清理日志 echo "3. 清理日志文件..." if [ -d "logs" ]; then mkdir -p backup/logs-$(date +%Y%m%d_%H%M%S) cp -r logs/* backup/logs-$(date +%Y%m%d_%H%M%S)/ 2>/dev/null || true rm -rf logs/* fi # 清理PM2缓存 echo "4. 清理PM2缓存..." rm -rf ~/.pm2/logs/* 2>/dev/null || true rm -f ~/.pm2/dump.pm2 2>/dev/null || true echo "清理完成!" echo "现在可以重新启动服务: npm run pm2:start" ``` ### 第六步:预防措施 #### 6.1 设置监控告警 ```bash # 创建进程监控脚本 cat > scripts/health-check.sh << 'EOF' #!/bin/bash # 每分钟检查一次进程状态 while true; do if ! pgrep -f "sms-scheduler" > /dev/null; then echo "$(date): SMS服务进程异常,尝试重启..." pm2 restart sms-scheduler fi sleep 60 done EOF chmod +x scripts/health-check.sh ``` #### 6.2 配置自动重启策略 在 `ecosystem.config.js` 中添加: ```javascript { apps: [{ name: 'sms-scheduler', script: 'app.js', instances: 1, autorestart: true, max_restarts: 10, min_uptime: '10s', max_memory_restart: '512M', restart_delay: 4000, watch: false, env: { NODE_ENV: 'production' } }] } ``` #### 6.3 建立定期清理机制 ```bash # 添加到crontab,每天凌晨2点清理日志 0 2 * * * /path/to/sms-scheduler/scripts/cleanup-logs.sh # 创建日志清理脚本 cat > scripts/cleanup-logs.sh << 'EOF' #!/bin/bash # 保留最近7天的日志 find logs/ -name "*.log" -mtime +7 -delete # 清理PM2日志 find ~/.pm2/logs/ -name "*.log" -mtime +7 -delete EOF chmod +x scripts/cleanup-logs.sh ``` ### 快速清理命令总结 当需要快速清理时,按顺序执行以下命令: ```bash # 1. 停止PM2 pm2 stop all && pm2 delete all && pm2 kill # 2. 查找并杀死残留进程 ps aux | grep -E "(sms|app\.js)" | grep -v grep kill -9 $(ps aux | grep -E "(sms|app\.js)" | grep -v grep | awk '{print $2}') # 3. 清理日志 rm -rf logs/* # 4. 重新启动 npm run pm2:start ``` ### 故障诊断清单 如果清理后仍有问题,按以下清单检查: - [ ] 确认所有相关进程已被杀死 - [ ] 检查端口是否被占用 - [ ] 验证配置文件语法正确 - [ ] 确认环境变量加载正确 - [ ] 检查文件权限 - [ ] 验证网络连接 - [ ] 查看系统资源(内存、磁盘) - [ ] 检查防火墙设置 - [ ] 验证API服务可用性 **重要提醒:在生产环境中执行清理操作前,请务必:** 1. 提前通知相关人员 2. 备份重要数据和配置 3. 选择业务低峰期执行 4. 准备回滚方案 5. 监控清理后服务状态 ### 调试模式 开发时可以启用调试模式: ```bash # 设置开发环境 export NODE_ENV=development # 启用详细日志 export LOG_VERBOSE=true # 启动服务 npm run pm2:start # 或者直接运行 npm run dev ``` ### 测试API响应 可以使用curl测试API响应格式: ```bash # 测试数据API curl -H "Authorization: Bearer YOUR_TOKEN" \ https://api.example.com/data # 测试短信API curl -X POST \ -H "Authorization: Bearer YOUR_TOKEN" \ -H "Content-Type: application/json" \ -d '{"phone":"13800138000","message":"测试消息"}' \ https://api.example.com/send ``` ## 安全建议 1. **API密钥保护** - 不要将Token提交到版本控制系统 - 使用环境变量存储敏感信息 - 定期更换API密钥 2. **网络安全** - 使用HTTPS协议 - 配置防火墙规则 - 限制API访问IP 3. **日志安全** - 定期清理日志文件 - 避免在日志中记录敏感信息 - 设置日志文件访问权限 4. **手机号码保护** - 日志中自动脱敏显示 - 不在错误信息中暴露完整号码 - 定期验证号码数据源 ## 性能优化 1. **批量处理** - 使用批量发送减少API调用次数 - 合理设置批次大小和延迟 2. **内存管理** - 设置合理的内存限制 - 定期监控内存使用情况 - 避免内存泄漏 3. **日志优化** - 设置合适的日志保留期限 - 控制单个日志文件大小 - 定期清理过期日志