module.exports = { apps: [{ name: 'jiebanke-backend', script: 'server.js', env: { PORT: 3200, NODE_ENV: 'production', }, autorestart: true, watch: false, max_memory_restart: '1G', output: 'logs/pm2.log', error: 'logs/pm2-error.log', log: 'logs/pm2-combined.log', pid_file: 'pm2.pid', instances: 1, exec_mode: 'fork' }] }; #!/bin/bash # 结伴客后端服务启动脚本 # 用于启动Node.js后端服务 # 设置颜色变量 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 显示脚本使用说明 show_usage() { echo "用法: $0 [选项]" echo "选项:" echo " start 启动后端服务" echo " stop 停止后端服务" echo " restart 重启后端服务" echo " status 查看服务状态" echo " help 显示帮助信息" } # 检查是否安装了Node.js check_node() { if ! command -v node &> /dev/null; then echo -e "${RED}错误: 未找到Node.js,请先安装Node.js${NC}" exit 1 fi NODE_VERSION=$(node -v) echo -e "${GREEN}✓ Node.js版本: ${NODE_VERSION}${NC}" } # 检查是否安装了npm check_npm() { if ! command -v npm &> /dev/null; then echo -e "${RED}错误: 未找到npm,请先安装npm${NC}" exit 1 fi NPM_VERSION=$(npm -v) echo -e "${GREEN}✓ npm版本: ${NPM_VERSION}${NC}" } # 检查依赖是否已安装 check_dependencies() { if [ ! -d "node_modules" ]; then echo -e "${YELLOW}警告: 未找到node_modules目录,正在安装依赖...${NC}" npm install if [ $? -ne 0 ]; then echo -e "${RED}错误: 依赖安装失败${NC}" exit 1 fi echo -e "${GREEN}✓ 依赖安装完成${NC}" else echo -e "${GREEN}✓ 依赖已安装${NC}" fi } # 启动服务 start_service() { # 检查服务是否已经在运行 if pgrep -f "node.*server.js" > /dev/null; then echo -e "${YELLOW}警告: 服务已在运行中${NC}" exit 1 fi echo -e "${GREEN}正在启动结伴客后端服务...${NC}" # 设置环境变量 export NODE_ENV=production export PORT=${PORT:-3200} # 启动服务并将其放到后台运行 nohup npm start > server.log 2>&1 & SERVER_PID=$! # 将PID保存到文件 echo $SERVER_PID > server.pid # 等待几秒钟让服务启动 sleep 3 # 检查服务是否成功启动 if pgrep -f "node.*server.js" > /dev/null; then echo -e "${GREEN}✓ 服务启动成功${NC}" echo -e "${GREEN}✓ PID: ${SERVER_PID}${NC}" echo -e "${GREEN}✓ 日志文件: server.log${NC}" echo -e "${GREEN}✓ 访问地址: http://localhost:${PORT}${NC}" else echo -e "${RED}✗ 服务启动失败,请检查日志文件 server.log${NC}" rm -f server.pid exit 1 fi } # 停止服务 stop_service() { if [ ! -f server.pid ]; then if pgrep -f "node.*server.js" > /dev/null; then echo -e "${YELLOW}警告: 找到正在运行的服务,但PID文件不存在${NC}" echo -e "${YELLOW}尝试查找并终止服务...${NC}" pkill -f "node.*server.js" sleep 2 if pgrep -f "node.*server.js" > /dev/null; then echo -e "${RED}✗ 无法终止服务${NC}" exit 1 else echo -e "${GREEN}✓ 服务已终止${NC}" fi else echo -e "${YELLOW}服务未在运行${NC}" fi else SERVER_PID=$(cat server.pid) if ps -p $SERVER_PID > /dev/null; then echo -e "${GREEN}正在停止服务 (PID: ${SERVER_PID})...${NC}" kill $SERVER_PID sleep 3 if ps -p $SERVER_PID > /dev/null; then echo -e "${YELLOW}服务未响应,强制终止...${NC}" kill -9 $SERVER_PID fi rm -f server.pid echo -e "${GREEN}✓ 服务已停止${NC}" else echo -e "${YELLOW}PID文件存在但服务未在运行${NC}" rm -f server.pid fi fi } # 查看服务状态 status_service() { if [ -f server.pid ]; then SERVER_PID=$(cat server.pid) if ps -p $SERVER_PID > /dev/null; then echo -e "${GREEN}✓ 服务正在运行 (PID: ${SERVER_PID})${NC}" else echo -e "${RED}✗ PID文件存在但服务未在运行${NC}" fi else if pgrep -f "node.*server.js" > /dev/null; then echo -e "${GREEN}✓ 服务正在运行${NC}" else echo -e "${YELLOW}服务未在运行${NC}" fi fi } # 查看日志 tail_logs() { if [ -f server.log ]; then tail -f server.log else echo -e "${RED}日志文件不存在${NC}" fi } # 主逻辑 main() { # 获取命令行参数 ACTION=${1:-"start"} case "$ACTION" in start) check_node check_npm check_dependencies start_service ;; stop) stop_service ;; restart) stop_service sleep 2 check_node check_npm check_dependencies start_service ;; status) status_service ;; logs) tail_logs ;; help) show_usage ;; *) echo -e "${RED}未知选项: $ACTION${NC}" show_usage exit 1 ;; esac } # 执行主逻辑 main "$@" ``` ``` @echo off title 结伴客后端服务PM2启动脚本 setlocal enabledelayedexpansion :: 设置颜色 for /f "delims=" %%i in ('echo prompt $E^| cmd') do set "ESC=%%i" :: 显示使用说明 if "%1"=="" ( call :show_usage goto :eof ) :: 根据参数执行相应操作 if "%1"=="start" ( call :start_service ) else if "%1"=="stop" ( call :stop_service ) else if "%1"=="restart" ( call :restart_service ) else if "%1"=="status" ( call :status_service ) else if "%1"=="logs" ( call :logs_service ) else if "%1"=="delete" ( call :delete_service ) else if "%1"=="list" ( call :list_service ) else if "%1"=="help" ( call :show_usage ) else ( echo %ESC%[91m未知选项: %1%ESC%[0m call :show_usage ) goto :eof :: 显示使用说明 :show_usage echo 用法: %0 [选项] echo 选项: echo start 使用PM2启动后端服务 echo stop 停止PM2管理的后端服务 echo restart 重启PM2管理的后端服务 echo status 查看PM2服务状态 echo logs 查看PM2服务日志 echo delete 从PM2中删除应用 echo list 列出所有PM2应用 echo help 显示帮助信息 goto :eof :: 检查Node.js :check_node echo 检查Node.js环境... node -v >nul 2>&1 if %errorlevel% neq 0 ( echo %ESC%[91m错误: 未找到Node.js,请先安装Node.js%ESC%[0m exit /b 1 ) else ( for /f %%i in ('node -v') do set NODE_VERSION=%%i echo %ESC%[92m✓ Node.js版本: %NODE_VERSION%%ESC%[0m ) goto :eof :: 检查npm :check_npm echo 检查npm环境... npm -v >nul 2>&1 if %errorlevel% neq 0 ( echo %ESC%[91m错误: 未找到npm,请先安装npm%ESC%[0m exit /b 1 ) else ( for /f %%i in ('npm -v') do set NPM_VERSION=%%i echo %ESC%[92m✓ npm版本: %NPM_VERSION%%ESC%[0m ) goto :eof :: 检查PM2 :check_pm2 echo 检查PM2环境... pm2 -v >nul 2>&1 if %errorlevel% neq 0 ( echo %ESC%[93m警告: 未找到PM2,正在安装...%ESC%[0m npm install -g pm2 if !errorlevel! neq 0 ( echo %ESC%[91m错误: PM2安装失败%ESC%[0m exit /b 1 ) echo %ESC%[92m✓ PM2安装完成%ESC%[0m ) else ( for /f %%i in ('pm2 -v') do set PM2_VERSION=%%i echo %ESC%[92m✓ PM2版本: %PM2_VERSION%%ESC%[0m ) goto :eof :: 检查依赖 :check_dependencies if not exist "node_modules" ( echo %ESC%[93m警告: 未找到node_modules目录,正在安装依赖...%ESC%[0m npm install if !errorlevel! neq 0 ( echo %ESC%[91m错误: 依赖安装失败%ESC%[0m exit /b 1 ) echo %ESC%[92m✓ 依赖安装完成%ESC%[0m ) else ( echo %ESC%[92m✓ 依赖已安装%ESC%[0m ) goto :eof :: 启动服务 :start_service call :check_node call :check_npm call :check_pm2 call :check_dependencies echo %ESC%[92m正在使用PM2启动结伴客后端服务...%ESC%[0m pm2 start ecosystem.config.js --env production if %errorlevel% equ 0 ( echo %ESC%[92m✓ 服务已通过PM2启动%ESC%[0m echo %ESC%[92m✓ 执行 'pm2 list' 查看运行中的应用%ESC%[0m echo %ESC%[92m✓ 执行 'pm2 logs' 查看应用日志%ESC%[0m ) else ( echo %ESC%[91m✗ 服务启动失败%ESC%[0m exit /b 1 ) goto :eof :: 停止服务 :stop_service call :check_pm2 echo %ESC%[92m正在停止PM2管理的服务...%ESC%[0m pm2 stop ecosystem.config.js if %errorlevel% equ 0 ( echo %ESC%[92m✓ 服务已停止%ESC%[0m ) else ( echo %ESC%[93m可能没有正在运行的服务%ESC%[0m ) goto :eof :: 重启服务 :restart_service call :check_pm2 echo %ESC%[92m正在重启PM2管理的服务...%ESC%[0m :: 检查应用是否在运行,如果未运行则直接启动 call :is_app_running if %errorlevel% neq 0 ( echo %ESC%[93m应用未在运行,正在启动...%ESC%[0m pm2 start ecosystem.config.js --env production ) else ( pm2 restart ecosystem.config.js --env production ) if %errorlevel% equ 0 ( echo %ESC%[92m✓ 服务已重启%ESC%[0m ) else ( echo %ESC%[91m✗ 服务重启失败%ESC%[0m exit /b 1 ) goto :eof :: 删除应用 :delete_service call :check_pm2 echo %ESC%[92m正在从PM2中删除应用...%ESC%[0m :: 检查应用是否存在 call :is_app_running if %errorlevel% neq 0 ( echo %ESC%[93m应用不存在或未在运行%ESC%[0m goto :eof ) pm2 delete ecosystem.config.js if %errorlevel% equ 0 ( echo %ESC%[92m✓ 应用已从PM2中删除%ESC%[0m ) else ( echo %ESC%[93m删除应用时遇到问题%ESC%[0m ) goto :eof :: 查看服务状态 :status_service call :check_pm2 echo %ESC%[92mPM2应用状态:%ESC%[0m pm2 list goto :eof :: 列出所有应用 :list_service call :check_pm2 echo %ESC%[92mPM2应用列表:%ESC%[0m pm2 list goto :eof :: 查看日志 :logs_service call :check_pm2 echo %ESC%[92m正在查看应用日志...%ESC%[0m pm2 logs ecosystem.config.js goto :eof