pm2 可以运行“npm start”脚本吗

Posted

技术标签:

【中文标题】pm2 可以运行“npm start”脚本吗【英文标题】:Can pm2 run an 'npm start' script 【发布时间】:2015-10-13 07:05:04 【问题描述】:

有没有办法让 pm2 运行 npm 启动脚本,还是只需要运行 pm2 start app.js

所以在开发中

npm start

然后在使用 pm2 进行生产时,您会运行类似

pm2 start 'npm start'

forever 中有一种等效的方法:

forever start -c "npm start" ./

【问题讨论】:

这是对 Dhaval ***.com/a/37775318/4828326 给出的答案的扩展 1. 首先将 pm2 添加到您的 package.json 2. 对于开发模式,更新您的包 json 脚本,如下所示:“pm2:dev”:“ node_modules/pm2/bin/pm2-dev start npm -- start", 【参考方案1】:

PM2 现在支持 npm start:

pm2 start npm -- start

要为 PM2 进程分配名称,请使用 --name 选项:

pm2 start npm --name "app name" -- start

【讨论】:

使用该命令时如何给进程设置名称?我尝试使用--name "app",但它只是将其设置为 npm。 pm2 start npm --name "你的APP名称" -- start 有人知道如何在进程文件中设置npm start吗? 当我尝试这个时,我怎么会得到“停止”状态?我的启动脚本看起来像这样"start": "cross-env NODE_ENV=production nodemon dist-prod/server.js" 啊,我想我找到了问题的答案。这不是 pm2 或 npm 的事情,它似乎是一种 *nix 的说法“我已经完成了提供命令选项并想开始传递参数”:unix.stackexchange.com/questions/11376/…【参考方案2】:

那些使用像.json 文件这样的配置脚本来运行pm2 进程的人可以使用npm start 或任何其他类似的脚本 -

my-app-pm2.json


    "apps": [
        
            "name": "my-app",
            "script": "npm",
            "args" : "start"
        
    ]

那么简单——

pm2 start my-app-pm2.json

编辑 - 当您在父目录中有此配置脚本并希望在子目录中启动应用程序时处理用例,然后使用cwd 属性。

假设我们的应用程序在相对于这个配置文件的子目录nested-app中-


    "apps": [
        
            "name": "my-nested-app",
            "cwd": "./nested-app",
            "script": "npm",
            "args": "start"
        
    ]

更多详情here.

【讨论】:

如果我想从父文件夹运行启动 npm 脚本,这将如何工作? 您能详细说明一下吗?我假设您在问 如何运行 npm start 从项目目录之外? . 我正在使用配置脚本来运行子文件夹中的多个节点应用程序。带有start 脚本信息的 package.json 位于其中之一。请参阅此要点:gist.github.com/gianpaj/04c5680a8275616aac5e46374e07f673 当我运行它时,它不知道 npm 应该从哪里运行。谢谢 @GianfrancoP。您可以使用cwd 属性。检查我编辑的答案:) 我尝试使用 sudo npm 并显示访问错误以创建一个艰难的目录 我已将所有权限授予用户作为 root 并且还以 sudo pm2 start config.json 运行 pm2 命令【参考方案3】:

使用npm run

pm2 start npm --name "app_name" -- run script_name

【讨论】:

确实,我同意 @Adiii 的观点,因为它可以作为 npm 脚本运行,它只是没有比这更好的了!【参考方案4】:

是的。使用pm2 start npm --no-automation --name app name -- run script name。有用。 --no-automation 标志在那里 because without it PM2 will not restart your app when it crashes.

【讨论】:

你知道如何在生态系统.js 配置文件中使用这个标志吗? 更新:好的,我发现你需要指定“自动化”:false。 @twigg pm2 --help | grep 'no-autom' 在 1.0.2 版本中为我返回一行【参考方案5】:

我需要在 pm2 中在我的应用程序上运行特定的 npm 脚本(针对每个环境) 就我而言,是在我创建暂存/测试服务时

对我有用的命令(args 必须以这种方式转发):

pm2 start npm --name "my-app-name" -- run "npm:script"

例子:

pm2 start npm --name "myApp" -- run "start:test"

pm2 start npm --name "myApp" -- run "start:staging"

pm2 start npm --name "myApp" -- run "start:production"

希望对你有帮助

【讨论】:

请注意“--run”之间有一个空格。空间需要在那里,否则您将获得无效的选项运行。【参考方案6】:

我在下面编写了 shell 脚本(命名为 start.sh)。 因为我的package.jsonprestart 选项。 所以我想运行npm start

#!/bin/bash
cd /path/to/project
npm start

然后,在 pm2 之前启动start.sh

pm2 start start.sh --name appNameYouLike

【讨论】:

很好。不幸的是,这在使用 startOrRestart 命令时不起作用。 @xpepermint 最后只使用 -f 标志。它强制启动。 (即如果已经启动,它将重新启动)【参考方案7】:

您需要在此处提供应用名称,例如 myapp

pm2 start npm --name appName -- run script name

你可以检查一下

pm2 list

你也可以加时间

pm2 restart "id" --log-date-format 'DD-MM HH:mm:ss.SSS'

pm2 restart "id" --time

您可以通过以下方式查看日志

pm2 log "id"

pm2 log "appName"

获取所有应用的日志

pm2 logs

【讨论】:

嗨,@pharaj_ali,你能解释一下这部分-- run script name 吗?我在 pm2 文档中找不到它。我已经阅读了您的答案的编辑历史,发现了这个有趣的编辑:in case of different script name use run with script name and in case of start script no need to add run。如果我理解,使用run script name 是用于多个脚本并且只有npm start 使用pm2 start npm --name appName -- start 更相关?另外我不明白为什么--start/run之间的空格有什么建议吗?谢谢 嗨 @YohanW.Dunon 是的,你在运行 npm 时是对的,如果我们使用启动脚本,那么我们不需要使用 run there npm start 但如果是其他脚本,我们使用 run like npm run script name 对于-- 之间的空格,我认为这只是他们使用的方式(不确定)如果您找到答案,请告诉我【参考方案8】:

是的,我们可以,现在 pm2 支持 npm start,--name 到物种应用程序名称。

pm2 start npm --name "app" -- start

【讨论】:

这是真正帮助我的答案。非常感谢。【参考方案9】:

查看以启用集群:

pm2 start npm --name "AppName" -i 0 -- run start

你怎么看?

【讨论】:

-i 0 是做什么的? 根据可用 CPU 启动最大进程数(集群模式)【参考方案10】:

如果您通过节点模块而不是全局使用 PM2,则需要设置 interpreter: 'none' 才能使上述解决方案起作用。相关文档here。

ecosystem.config.js:

  apps: [
    
      name: 'myApp',
      script: 'yarn',
      args: 'start',
      interpreter: 'none',
    ,
  ],

【讨论】:

【参考方案11】:

pm2 start npm --name "custom_pm2_name" -- run prod

"scripts": 
    "prod": "nodemon --exec babel-node ./src/index.js"
  

这对我有用,而其他人没有

【讨论】:

非常感谢,卢克。特别感谢您在旁边发布了您的脚本,无需再猜测哪个“开始”是哪个 :) 这应该被评为更高,终于可以正常工作了。【参考方案12】:

普通用户

PM2 现在支持 npm start:

pm2 start npm -- start

要为 PM2 进程分配名称,请使用“--name”选项:

pm2 start npm --name "your desired app name" -- start

对于根用户

sudo pm2 start npm -- start

要为 PM2 进程分配名称,请使用“--name”选项:

sudo pm2 start npm --name "your desired app name" -- start

【讨论】:

【参考方案13】:

不幸的是,pm2 似乎不支持您要求https://github.com/Unitech/PM2/issues/1317 的确切功能。

建议的替代方法是使用ecosystem.json 文件Getting started with deployment,其中可能包括生产和开发环境的设置。但是,这仍然使用npm start 来引导您的应用程序。

【讨论】:

你这是什么意思? However, this is still using npm start to bootstrap your app. 你真的可以使用pm2 运行npm start 吗?【参考方案14】:
pm2 start ./bin/www

可以跑

如果您想部署多台服务器 你可以这样做。而不是 pm2 start npm -- start

【讨论】:

【参考方案15】:

开始前不要忘记空格

pm2 start npm --[space]start

所以正确的命令是:

pm2 start npm -- start

【讨论】:

【参考方案16】:

在 CentOS 7 上运行良好

PM2 版本 4.2.1

让我们假设两种情况:

1. npm start //server.js

pm2 start "npm -- start" --name myMainFile

2。 npm run main //main.js

pm2 start "npm -- run main" --name myMainFile

【讨论】:

【参考方案17】:

要使用 npm start 方法运行 PM2 并给它一个 name,运行这个,pm2 start npm --name "your_app_name" -- start

通过为日志传递日期格式来运行它,pm2 start npm --name "your_name" --log-date-format 'DD-MM HH:mm:ss.SSS' -- start

【讨论】:

【参考方案18】:

现在,您可以在之后使用:

pm2 start npm -- start

关注https://github.com/Unitech/pm2/issues/1317#issuecomment-220955319

【讨论】:

你能扩展你的答案吗?来自How to answer 的建议:鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。【参考方案19】:

是的,您绝对可以通过优雅地使用 pm2 配置 (json) 文件来非常高效地完成此操作。

package.json 文件(包含以下示例脚本)

"scripts": 
    "start": "concurrently npm:server npm:dev",
    "dev": "react-scripts start",
    "build": "node ./scripts/build.js",
    "eject": "react-scripts eject",
    "lint": "eslint src server",
    "shivkumarscript": "ts-node -T -P server/tsconfig.json server/index.ts"
  

假设我们要使用 pm2 实用程序运行名为 'shivkumarscript' 的脚本。因此,我们的 pm2 配置文件应该如下所示,包含值为 'npm' 的 'script' 键和值为 'run' 的 'args' 键。在我们的例子中,脚本名称是 'shivkumarscript'。

ecosystem.config.json 文件

module.exports = 
    apps: [
        
            name: "NodeServer",
            script: "npm",
            automation: false,
            args: "run shivkumarscript",
            env: 
                NODE_ENV: "development"
            ,
            env_production: 
                NODE_ENV: "production"
            
        
    ]

假设你已经在你的机器上安装了 Node.js、NPM 和 PM2。然后下面应该是通过 pm2 启动应用程序的命令,该命令将依次运行 npm 脚本(在应用程序的 package.json 文件中提到的命令行):

生产环境:

pm2 start ecosystem.config.js --env production --only NodeServer

对于开发环境:

pm2 start ecosystem.config.js --only NodeServer

...还有 Boom!伙计们

【讨论】:

【参考方案20】:

您可以将目录更改为您的项目

cd /my-project

然后运行

pm2 start "npm run start" \\ run npm script from your package.json

阅读更多here

【讨论】:

以上是关于pm2 可以运行“npm start”脚本吗的主要内容,如果未能解决你的问题,请参考以下文章

得到错误!缺少脚本:在 <npm start> 命令上启动

PM2 简单使用,守护node进程

我可以使用 pm2 代替负载均衡器吗?

pm2基本使用

运行 npm start 时如何从 URL 中删除端口号?

“npm run dev”和“npm start”之间的区别