如何使用 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 应用程序的完整解决方案。
** 还有两种参数
- node-args - 在 npm start
之前使用
- 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/config
为 index.js
运行 pm2 start
,其中包括来自 [=21= 的环境变量.env 文件 dotenv
我正在使用 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 应用程序的完整解决方案。
** 还有两种参数
- node-args - 在 npm start 之前使用
- 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/config
为 index.js
运行 pm2 start
,其中包括来自 [=21= 的环境变量.env 文件 dotenv