【发布时间】:2015-03-11 06:54:42
【问题描述】:
我正在使用 pm2 来启动我的应用程序,但我无法将参数传递给它。我使用的命令是pm2 start app.js -- dev。虽然这永远有效。
【问题讨论】:
标签: node.js express forever pm2
我正在使用 pm2 来启动我的应用程序,但我无法将参数传递给它。我使用的命令是pm2 start app.js -- dev。虽然这永远有效。
【问题讨论】:
标签: node.js express forever pm2
如果你想从 CLI 传递节点参数,那么
pm2 start myServer.js --node-args="--production --port=1337"
.
已编辑
你可以在--之后添加任何参数
pm2 start app.js -- --prod --second-arg --third-arg
deploymemt 的 Sails 文档。
【讨论】:
args和node-args
您可以按照此票中的说明进行操作: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 系统中的守护进程通常采用参数的方式,因为这些参数不会随进程丢失。考虑到您的情况,这可能并不重要,但这是一个很好的做法。
此外,您应该考虑在本地停止/启动,并尽可能重新启动(如果在集群模式下),以防止生产中的停机。
【讨论】:
staging 并且 db 主机为 1.1.1.1 但是如果我们不知道数据库主机直到它投入生产,情况都是如此时间。我们如何在启动时设置数据库主机?我还是一头雾水
可以用进程定义参数。
您可以使用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
您可以通过在-- 之后传递参数来向脚本发送参数。例如:pm2 start app.js -i max -- -a 23 // Pass arguments after -- to app.js
【讨论】:
我已经测试过了,它可以在我的 Windows 机器上运行。下面是使用 pm2 将参数传递给 nodejs 应用程序的完整解决方案。
** 参数也有2种
使用 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
【讨论】:
我总是使用 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@是脚本的第二个参数。
【讨论】:
有两种方法可以在 CLI 中将参数从 pm2 传递到 nodejs:
两种方式,您都会发现这些值存在于process.argv (['dev','--port=1234'])中
【讨论】:
error: unknown option --port
你可以像这样为节点传递参数:
NODE_TLS_REJECT_UNAUTHORIZED=0 NODE_ENV=dev pm2 start server.js --name web-server
【讨论】:
我将补充上述 npm 脚本
的答案// package.json
{
"scripts": {
"start": "pm2 start --node-args=\"-r dotenv/config\" index.js"
}
}
npm run start 使用 node-args -r dotenv/config 为 index.js 运行 pm2 start,其中包括来自 .env 文件的环境变量和 dotenv em>
【讨论】:
来自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
【讨论】:
您需要使用以下内容启动 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' ]
【讨论】: