我正在使用pm2启动我的应用程序,但我无法将参数传递给它。我使用的命令是pm2 start app.js -- dev
. 虽然这永远有效。
11 回答
如果你想从 CLI 传递节点参数,那么
pm2 start myServer.js --node-args="--production --port=1337"
.
已编辑
您可以在之后添加任何参数--
pm2 start app.js -- --prod --second-arg --third-arg
用于deploymemt的 Sails 文档。
您可以按照此票中的说明进行操作: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 系统中的守护进程通常采用参数的方式,因为这些参数不会随进程丢失。考虑到您的情况,这可能并不重要,但这是一个很好的做法。
此外,您应该考虑在本地停止/启动,并尽可能重新启动(如果在集群模式下),以防止生产中的停机。
可以使用过程定义参数。
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]
得到第一个参数,依此类推。
您可以通过在--
. 例如:pm2 start app.js -i max -- -a 23 // Pass arguments after -- to app.js
我已经测试过了,它可以在我的 Windows 机器上运行。下面是使用 pm2 将参数传递给 nodejs 应用程序的完整解决方案。
** 还有 2 种类型的参数
- node-args - 在 npm start 之前使用
- 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
我总是使用 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
的第二个参数。
那么有两种方法可以在 CLI 中将参数从 pm2 传递到 nodejs:
- pm2 start app.js -- dev --port=1234 (注意--和dev之间有一个额外的空格)
- pm2 启动 app.js --node-args="dev --port=1234"
两种方式,您都会发现这些值存在于process.argv
(['dev','--port=1234'])
您可以像这样为节点传递参数:
NODE_TLS_REJECT_UNAUTHORIZED=0 NODE_ENV=dev pm2 start server.js --name web-server
我将补充上述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
来自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' ]