【问题标题】:How to pass execution arguments to app using PM2?如何使用 PM2 将执行参数传递给应用程序?
【发布时间】:2015-03-11 06:54:42
【问题描述】:

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

【问题讨论】:

    标签: node.js express forever pm2


    【解决方案1】:

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

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

    .

    已编辑

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

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

    deploymemt 的 Sails 文档。

    【讨论】:

    • 这很好。但是当将它传递给 Docker 时,这是行不通的。任何人都可以,请帮助我。 .入口点 ["pm2"] CMD ["start", "msg/myServer.js", "--node-args='--firstarg'","--no-daemon"]
    • @RajRajen:如果您使用 docker,我觉得运行 PM2 不是您的最佳选择。要么让 Docker 监控你的应用程序,并使用它的重启策略来保持你的应用程序存活,要么使用类似 supervisord 的东西,这样你的容器就不必在每次应用程序出现故障时重新启动。当您在 docker 中运行 PM2 时,您会丢失 PM2 的许多有用功能,而它真正所做的只是让您的应用程序保持活力。到那时,使用 forever 或 init 系统也可以,而且可能更容易。对于每个容器运行超过 1 个服务的 docker 容器,Supervisord 非常常见。
    • 对于 docker,您可以使用专用的 PM2 命令 pm2-docker。更多信息在这里:pm2.keymetrics.io/docs/usage/docker-pm2-nodejs
    • 只是要注意,在json配置文件中,字段名称是argsnode-args
    • 根据pm2.keymetrics.io/docs/usage/quick-start,您只需添加 -- 之后的任何内容都将作为参数传递;不需要-x; -x 表示使用fork系统执行命令
    【解决方案2】:

    您可以按照此票中的说明进行操作: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 系统中的守护进程通常采用参数的方式,因为这些参数不会随进程丢失。考虑到您的情况,这可能并不重要,但这是一个很好的做法。

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

    【讨论】:

    • 我使用 AWS Code Deploy 和我的 Node.JS 应用程序进行了设置,它运行良好。我在本地使用端口 4040,在 AWS 上使用 80。这是一个优雅的解决方案,可以确保我的端口设置正确。谢谢!
    • 在您的示例中,您仅将 NODE_ENV 设置为 staging 并且 db 主机为 1.1.1.1 但是如果我们不知道数据库主机直到它投入生产,情况都是如此时间。我们如何在启动时设置数据库主机?我还是一头雾水
    • @xbmono 我想你会做某种服务发现,或者通过环境变量读取它。一个技巧是让你的配置成为一个实际的 js 文件,它可以从环境或发现服务(即 consul)中提取某些配置。
    • @TobiasFeil 该解决方案在提供的链接中注明。通过 env var 和 file 提供配置通常是更好的做法。我提到了这两种解决方案,并选择详细说明我认为更好的解决方案。没必要粗鲁。
    • 谢谢@tsturzl - 是的,这就是我需要的。您有任何显示示例的链接吗?
    【解决方案3】:

    可以用进程定义参数。

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

    【讨论】:

    • 如果您想要持续(持久)配置,这是一个更好的解决方案。我想你错过了关于如何使用ecosystem.config.js 的部分。如pm2 start ecosystem.config.js
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      ** 参数也有2种

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

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

      选项 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(使用配置文件): 如果您使用的是 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
      

      【讨论】:

        【解决方案6】:

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

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

        filename.py 是 python 脚本的名称,没有 符号,我想使用 PM2 运行
        nameForJob 是工作的有意义的名称,没有 符号
        InterpreterName 是用于运行脚本的python解释器,在linux中通常是python3
        timeinMilliseconds是我们的脚本需要等待重新运行的时间
        param1是脚本的第一个参数
        @ 987654328@是脚本的第二个参数。

        【讨论】:

          【解决方案7】:

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

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

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

          【讨论】:

          • 当我运行第一个选项时,它显示:error: unknown option --port
          【解决方案8】:

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

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

          【讨论】:

            【解决方案9】:

            我将补充上述 npm 脚本

            的答案

            对于 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,其中包括来自 .env 文件的环境变量和 dotenv em>

            【讨论】:

            • 如何将额外的自定义变量传递到此脚本中?
            【解决方案10】:

            来自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
            

            【讨论】:

              【解决方案11】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-12-24
                • 2023-03-04
                • 1970-01-01
                • 2010-11-13
                • 2010-09-30
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多