我正在使用pm2启动我的应用程序,但我无法将参数传递给它。我使用的命令是pm2 start app.js -- dev
,虽然在forever中可以正常工作。
pm2 start myServer.js --node-args="--production --port=1337"
已编辑
您可以在--
后添加任何参数
pm2 start app.js -- --prod --second-arg --third-arg
Sails文档关于部署。
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系统中守护进程通常接受参数的方式,因为这些参数不会随着进程而丢失。考虑到您的情况,这可能并不重要,但这是一个好的实践。
此外,在生产环境中,应考虑尽可能在本地停止/启动,并在集群模式下重新启动以防止停机时间。
staging
,并且该环境下的数据库主机是1.1.1.1
。但是如果我们在生产环境中不知道数据库主机,这种情况经常发生,我们该如何在启动时设置数据库主机呢?我还是很困惑。 - xbmono可以通过进程定义参数。
您可以在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您可以通过在 --
后传递参数来将参数发送到您的脚本中。例如:pm2 start app.js -i max -- -a 23 // 将参数传递给 app.js
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
是用于运行脚本的 Python 解释器,通常在 Linux 中是 python3
。
timeinMilliseconds
是我们的脚本需要等待并重新运行的时间,以毫秒为单位。
param1
是脚本的第一个参数。
param2
是脚本的第二个参数。
您可以通过两种方式将参数从pm2传递给CLI中的nodejs:
无论哪种方式,您都会发现这些值存在于process.argv
中(['dev','--port=1234'])
错误:未知选项--port
。 - Salim Shamim我将为npm脚本提供补充答案。
// package.json
{
"scripts": {
"start": "pm2 start --node-args=\"-r dotenv/config\" index.js"
}
}
npm run start
运行 pm2 start
命令,启动 index.js
文件,并使用 node-args 参数 -r dotenv/config
,该参数从 .env 文件中获取环境变量,dotenv 是一个工具包。
NODE_TLS_REJECT_UNAUTHORIZED=0 NODE_ENV=dev pm2 start server.js --name web-server
//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
和node-args
。 - Dave