如何使用 PM2 将执行参数传递给应用程序?

How to pass execution arguments to app using PM2?

我正在使用 pm2 来启动我的应用程序,但我无法向它传递参数。我使用的命令是pm2 start app.js -- dev。虽然这适用于永远。

您可以按照此工单中的说明进行操作:https://github.com/Unitech/pm2/issues/13

尽管如果您要传递环境,您可能需要考虑利用环境变量。这样你就可以创建一个变量,该变量可以被该环境中的任何进程访问 process.env.*.

所以你有一个配置文件config.json:

{
   "dev": {
        "db": {
            "hosts":["localhost"],
            "database": "api"
        },
        "redis": {
            "hosts": ["localhost"]
        }
   },
   "staging": {
        "db": {
            "hosts":["1.1.1.1"],
            "database": "api"
        },
        "redis": {
            "hosts": ["2.2.2.2"]
        }
   },
   "production": {
        "db": {
            "hosts":["1.1.1.1", "1.1.1.2", "1.1.1.3"],
            "database": "api"
        },
        "redis": {
            "hosts": ["2.2.2.2", "2.2.2.3"]
        }
   }
}

然后导入配置:

var config=require('./config.json')[process.env.NODE_ENV || 'dev'];

db.connect(config.db.hosts, config.db.database);

然后您将通过 shell:

在您的环境中设置变量
export NODE_ENV=staging
pm2 start app.js

环境变量的持续时间与您的会话一样长。因此,您必须在该用户的 ~/.bashrc 文件中设置它,才能使变量持续存在。这将在每个会话中设置变量。

PM2 有一个 deploy system 允许你每次在你的应用程序被守护之前设置一个环境变量。这就是 POSIX 系统中的守护进程通常采用参数的方式,因为这些参数不会随进程丢失。考虑到您的情况,这可能无关紧要,但这是一个很好的做法。

此外,您应该考虑 stop/starting 在本地,并尽可能重新启动(如果在集群模式下)以防止在生产中停机。

如果您想从 CLI 传递节点参数,那么

pm2 start myServer.js --node-args="--production --port=1337"

.

已编辑

您可以在 --

之后添加任何参数
pm2 start app.js -- --prod --second-arg --third-arg

deploymemt 的 Sails 文档。

有两种方法可以在 CLI 中将参数从 pm2 传递到 nodejs:

  • pm2 start app.js --dev --port=1234(注意--和dev之间有一个额外的space)
  • pm2 启动 app.js --node-args="dev --port=1234"

无论哪种方式,您都会发现这些值存在于 process.argv (['dev','--port=1234'])

来自 pm2 文档

//Inject what is declared in env_production
$ pm2 start app.js --env production 

//Inject what is declared in env_staging
$ pm2 restart app.js --env staging

可以用进程定义参数。

您可以使用 args 键在 ecosystem.config.js 中定义一个新进程,如下所示:

{
  name            : 'my-service',
  script          : './src/service.js',
  args            : 'firstArg secondArg',
},
{
  name            : 'my-service-alternate',
  script          : './src/service.js',
  args            : 'altFirstArg altSecondArg',
}

这里,两个进程使用相同的文件(service.js),但向其传递不同的参数。

请注意,这些参数在 service.js 中处理。 在我的例子中,我只是使用 process.argv[2] 来获取第一个参数,依此类推。

您可以通过在 -- 之后传递参数来向您的脚本发送参数。例如:pm2 start app.js -i max -- -a 23 // Pass arguments after -- to app.js

您可以像这样为节点传递参数:

NODE_TLS_REJECT_UNAUTHORIZED=0 NODE_ENV=dev pm2 start server.js --name web-server

您需要使用以下内容启动 pm2: pm2 开始 app.js --name "app_name" -- arg1 arg2

然后在您的代码中,您可以通过以下方式获取参数: console.log(process.argv);

process.argv 是这样一个列表: [ '/usr/local/bin/node', '/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js', 'arg1', 'arg2' ]

我已经测试过,它可以在我的 windows 机器上运行。下面是使用 pm2 将参数传递给 nodejs 应用程序的完整解决方案。

** 还有两种参数

  1. node-args - 在 npm start
  2. 之前使用
  3. args - 在你的节点程序中使用

有两种方法可以使用 pm2 传递参数。

选项 1:使用 pm2 命令传递参数。

选项 2:使用配置文件,例如 ecosystem.config.js

选项 1(通过命令传递 arg):

pm2 start app/myapp1.js --node-args="--max-http-header-size=80000" -- arg1 arg2
//Access the arg as below in your node program.
console.log(process.argv[2]); // arg1
console.log(process.argv[3]); // arg2

选项 2(使用配置文件): 如果您使用 ecosystem.config.js。您可以使用以下配置进行定义:

    {
      name: 'my-app',
      script: 'app\myapp1.js',
      env: {
        NODE_ENV: 'DEV',
        PORT : 5051
      },
      node_args: '--max-http-header-size=80000',
      args : 'arg1 arg2',
      instances: 1,
      exec_mode: 'fork'
    }

以开发模式启动:

pm2 start --name myapp  app/myapp1.js -- .\ecosystem.config.js

要以生产模式启动,只需添加 --env=production

pm2 start --name myapp  app/myapp1.js -- .\ecosystem.config.js --env=production 
//Access the arg as below in your node program.
console.log(process.argv[2]); // arg1
console.log(process.argv[3]); // arg2

我总是在 Linux 环境中使用 PM2 来 运行 我的 python 脚本。所以考虑一个脚本只有一个参数并且需要在一段时间后连续 运行,那么我们可以这样传递它:

pm2 start <filename.py> --name <nameForJob> --interpreter <InterpreterName> --restart-delay <timeinMilliseconds> -- <param1> <param2>

filename.py 是 python 脚本的名称,没有 <> 符号,我想 运行 使用 PM2
nameForJob 是作业的有意义的名称,没有 <> 符号
InterpreterName是运行ning脚本的python解释器,在linux
中通常是python3 timeinMilliseconds 是我们的脚本需要等待的时间,然后 re-run 再次
param1 是脚本的第一个参数
param2 是脚本的第二个参数。

我将为 npm scripts

补充上面的答案

对于 npm 脚本

// package.json
{
  "scripts": {
    "start": "pm2 start --node-args=\"-r dotenv/config\" index.js"
  }
}

npm run start 使用 node-args -r dotenv/configindex.js 运行 pm2 start,其中包括来自 [=21= 的环境变量.env 文件 dotenv