2025-09-11 15:52:38 +08:00
|
|
|
|
#!/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 "$@"
|