如何使用pm2将参数传递给应用程序?


75

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

Answers:


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系统中守护程序通常采用参数的方式,因为这些参数不会随过程丢失。考虑到您的情况,它可能无关紧要,但它是一种很好的做法。

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


我使用AWS Code Deploy和我的Node.JS应用程序进行了设置,并且效果很好。我在本地使用端口4040,在AWS上使用端口80。这是确保我的端口正确设置的理想解决方案。谢谢!
BuffMcBigHuge 2016年

147

如果要从CLI传递节点参数,则

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

已编辑

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

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

航行有关deploymemt的文档。


1
很好 但是,当将其传递给Docker时,这是行不通的。谁能帮我。。ENTRYPOINT [“ pm2”] CMD [“开始”,“ msg / myServer.js”,“ --node-args ='-firstarg'”,“-no-daemon”]
Raj Rajen

1
@RajRajen:如果您使用的是docker,我觉得运行PM2不是您的最佳选择。要么让Docker监视您的应用程序,并使用其重启策略使您的应用程序保持活动状态,要么使用诸如超级用户之类的工具,这样您的容器就不必在每次应用程序关闭时都重新启动。当您在docker中运行PM2时,您将失去许多PM2的有用功能,而它真正要做的就是保持您的应用程序正常运行。到那时,使用永久或初始化系统同样可以,而且可能会更容易。对于每个容器运行多个服务的Docker容器,Supervisord非常常见。
tsturzl '16

3
对于docker,您可以使用专用的PM2命令pm2-docker。此处提供更多信息:pm2.keymetrics.io/docs/usage/docker-pm2-nodejs
Unitech

只是要注意,在json配置文件中,字段名称是argsnode-args
Dave

1
根据pm2.keymetrics.io/docs/usage/quick-start,您只需要添加-之后的任何内容都将作为参数传递;不需要-x; -x表示使用fork系统执行命令
Nick Steele

18

可以在过程中定义参数。

您可以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]获取第一个参数,依此类推。


如果要进行持续(持久)配置,这是一个更好的解决方案。我认为您错过了有关使用方法的部分ecosystem.config.js。例如pm2 start ecosystem.config.js
HankCa

11

您可以在后面传递参数,从而将参数发送给脚本--。例如:pm2 start app.js -i max -- -a 23 // Pass arguments after -- to app.js


2

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

  • pm2 start app.js-dev --port = 1234(请注意-和dev之间有多余的空间)
  • pm2 start app.js --node-args =“ dev --port = 1234”

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


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

1

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

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

1

我总是使用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的第二个参数。


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']


0

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

**还有两种类型的参数

  1. node-args-在npm启动之前使用
  2. args-在您的节点程序中使用

有两种方法可以通过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

0

我将补充以上有关npm脚本的答案

对于npm脚本

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

npm run start使用node-args运行pm2 start,其中包含带有dotenv的.env文件中的环境变量index.js -r dotenv/config

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.