87

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

4

11 回答 11

170

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

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

.

已编辑

您可以在之后添加任何参数--

pm2 start app.js -- --prod --second-arg --third-arg

用于deploymemt的 Sails 文档。

于 2015-08-29T05:05:19.820 回答
27

您可以按照此票中的说明进行操作: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 有一个部署系统,它允许您在每次应用程序被守护之前设置一个环境变量。这就是 POSIX 系统中的守护进程通常采用参数的方式,因为这些参数不会随进程丢失。考虑到您的情况,这可能并不重要,但这是一个很好的做法。

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

于 2015-03-11T07:43:23.773 回答
21

可以使用过程定义参数。

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

{
  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]得到第一个参数,依此类推。

于 2017-11-22T19:39:59.127 回答
12

您可以通过在--. 例如:pm2 start app.js -i max -- -a 23 // Pass arguments after -- to app.js

于 2018-06-29T14:44:52.797 回答
5

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

** 还有 2 种类型的参数

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

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

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

选项 2:使用配置文件,例如生态系统.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(使用配置文件): 如果您使用的是生态系统.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
于 2020-09-16T04:56:24.317 回答
3

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

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

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

于 2020-11-04T19:47:56.883 回答
2

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

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

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

于 2017-04-14T11:55:02.307 回答
2

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

NODE_TLS_REJECT_UNAUTHORIZED=0 NODE_ENV=dev pm2 start server.js --name web-server
于 2020-01-10T13:57:02.203 回答
2

我将补充上述npm 脚本的答案

对于 npm 脚本

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

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

于 2021-01-06T20:52:18.487 回答
1

来自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
于 2017-06-29T02:02:59.240 回答
0

您需要使用以下内容启动 pm2: pm2 start 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' ]

于 2020-04-14T13:04:00.523 回答