pm2运行项目实践记录(通过ecosystem.config.js配置并自动运行)

三个步骤:

1.配置运行配置文件(推荐使用js格式配置)

2.配置项目重启脚本

用于版本项目更新、重启、部署

3.生成快速链接并运行

4.设置PM2开机自启动

一、PM2 配置文件(ecosystem.config.js)

创建ecosystem.config.js文件:

复制代码
// ecosystem.config.js


const path = require('path');

// 固定不变的值直接写死
const APP_NAME = 'RentPay';  // 应用名通常不变
const APP_DIR = '/home/javaapp/RentPay';  // 部署路径通常固定
const JAR_FILE = 'RentPay.jar';  // jar文件名通常固定

// 可能经常调整的参数保留环境变量支持
const JAVA_OPTS = process.env.JAVA_OPTS || '-Xms2G -Xmx4G -XX:+UseG1GC';
const SPRING_PROFILE = process.env.SPRING_PROFILE || 'prod';
const MAX_MEMORY_RESTART = process.env.MAX_MEMORY_RESTART || '3G';


module.exports = {
  apps: [{
    name: APP_NAME,  // 固定值
    script: 'java',
    args: `-jar ${path.join(APP_DIR, JAR_FILE)}`,
//    args: `${JAVA_OPTS} -jar ${path.join(APP_DIR, JAR_FILE)} --spring.profiles.active=${SPRING_PROFILE}`,
    cwd: APP_DIR,
    interpreter: 'none',
    
    // 日志文件路径固定
    error_file: path.join(APP_DIR, 'logs', 'app-error.log'),
    out_file: path.join(APP_DIR, 'logs', 'app-out.log'),
//    log_date_format: 'YYYY-MM-DD HH:mm:ss',
    time: false
    
    // PM2监控参数可以灵活调整
//    max_memory_restart: MAX_MEMORY_RESTART,
//    autorestart: true,
//    watch: true
  }]
};

二、配置项目运行和重启的脚本

创建一个rp-restart.sh的文件:

复制代码
#!/bin/bash

APP_DIR="/home/javaapp/RentPay"
APP_NAME="RentPay"
CONFIG_FILE="RentpayEco.config.js"


# 切换到应用目录
cd "$APP_DIR" || {
    echo "Error: Cannot change to $APP_DIR"
    exit 1
}

echo "Restarting $APP_NAME..."

# 停止应用
if pm2 stop "$APP_NAME"; then
    echo "Application stopped successfully"
else
    echo "Warning: Application may not have been running or failed to stop"
fi


# 启动应用
if pm2 start "$CONFIG_FILE"; then
    echo "$APP_NAME application restarted successfully"
    
    # 可选:保存pm2配置
    #pm2 save
    
else
    echo "Error: Failed to start application"
    exit 1
fi

windows版本(ps1文件)

创建 restart_app.ps1文件:

复制代码
$APP_DIR = "C:\path\to\RentPay"
$APP_NAME = "RentPay"
$CONFIG_FILE = "RentpayEco.config.js"

# 切换到应用目录
try {
    Set-Location -Path $APP_DIR -ErrorAction Stop
} catch {
    Write-Error "Error: Cannot change to $APP_DIR"
    exit 1
}

Write-Host "Restarting $APP_NAME..."

# 停止应用
pm2 stop $APP_NAME
if ($LASTEXITCODE -eq 0) {
    Write-Host "Application stopped successfully"
} else {
    Write-Host "Warning: Application may not have been running or failed to stop"
}

# 启动应用
pm2 start $CONFIG_FILE
if ($LASTEXITCODE -eq 0) {
    Write-Host "$APP_NAME application restarted successfully"
    
    # 可选:保存pm2配置
    # pm2 save
    
} else {
    Write-Error "Error: Failed to start application"
    exit 1
}

三、 生成快速链接并运行

复制代码
#生成全局链接命令:

# 1. 删除旧的符号链接
sudo rm /usr/local/bin/qt-restart

# 2. 重新创建符号链接
sudo ln -s /home/javaapp/RentPay/rp-restart.sh /usr/local/bin/rp-restart

# 3. 确保原始脚本有执行权限
chmod +x /home/javaapp/RentPay/rp-restart.sh

# 4. 测试是否生效
rp-restart

四、设置PM2开机自启动

1.查看命令pm2 ls 或pm2 status

1.保存当前进程状态 pm2 save

  1. 生成开机自动启动脚本 pm2 startup

    [root@localhost nodeldsdoc]# pm2 ls

    [root@localhost nodeldsdoc]# pm2 save
    [PM2] Saving current process list...
    [PM2] Successfully saved in /root/.pm2/dump.pm2
    [root@localhost nodeldsdoc]# pm2 startup
    [PM2] Init System found: systemd
    (中间省略。。。。)
    $ pm2 unstartup systemd
    [root@localhost nodeldsdoc]#

相关推荐
淼澄研学11 小时前
Python实战:基于LangChain与Chroma构建企业级RAG知识库问答系统
开发语言·python·langchain
辰辉创聚11 小时前
In Vivo抗体是什么?| 体内抗体与普通科研抗体的区别
人工智能·python·时序数据库·in vivo抗体·体内抗体·体内级抗体
深圳市宝华视联11 小时前
Python 读取 IP 视频流简单 Demo
python·嵌入式硬件·opencv·网络协议·tcp/ip·实时音视频·嵌入式实时数据库
门思科技11 小时前
LoRaWAN Regional Parameters:为什么 CN470 和 EU868 的频点数不同
python·物联网
七牛开发者12 小时前
解读 Cordis:dsh 一切皆插件背后的运行时设计
前端·javascript·后端
雷工笔记12 小时前
KingFusion驾驶舱-产能信息模块开发实战
javascript
Joseph 乔12 小时前
【Python】卸载与重装
经验分享·python
归去来?12 小时前
Python 常用优雅写法
开发语言·python
名字还没想好☜12 小时前
Java 21 switch 模式匹配实战:sealed 接口 + record 替代 if-instanceof 链
java·人工智能·后端·python·spring
深蓝海拓12 小时前
基于QtPy (PySide6) 的PLC-HMI工程实战记录(五)为当前动作画面的信号连接变量
网络·笔记·python·学习·pyqt