407

Is there a way for pm2 to run an npm start script or do you just have to run pm2 start app.js

So in development

npm start

Then in production with pm2 you would run something like

pm2 start 'npm start'

There is an equivalent way to do this in forever:

forever start -c "npm start" ./
Ionică Bizău
  • 109,027
  • 88
  • 289
  • 474
svnm
  • 22,878
  • 21
  • 90
  • 105
  • 1
    This is extension to Answer given by Dhaval https://stackoverflow.com/a/37775318/4828326 1. First add pm2 to your package.json 2. For development mode, update your package json script like this: "pm2:dev": "node_modules/pm2/bin/pm2-dev start npm -- start", – Rama Krishna Dec 01 '19 at 04:31

22 Answers22

820

PM2 now supports npm start:

pm2 start npm -- start

To assign a name to the PM2 process, use the --name option:

pm2 start npm --name "app name" -- start
Ionică Bizău
  • 109,027
  • 88
  • 289
  • 474
Dhaval Chauhan
  • 8,777
  • 1
  • 17
  • 17
  • 5
    How can you set a name for the process when using this command? I tried using `--name "app"` but it just set it to npm. – silverlight513 Jul 29 '16 at 08:41
  • 194
    pm2 start npm --name "Your APP Name" -- start – Laukik Patel Aug 04 '16 at 07:07
  • 12
    Anyone know how to set `npm start` in the process file? – mqchen Jan 11 '17 at 14:18
  • 2
    How comes I got "stopped" status when I try this? my start script looks like this `"start": "cross-env NODE_ENV=production nodemon dist-prod/server.js"` – newman Apr 25 '18 at 04:40
  • What does the double dash do in this command? I was trying to look it up in the docs and in the cli `--help` readout for pm2 but couldn't find the explanation. – Chris Schmitz Mar 25 '19 at 20:32
  • 3
    ah, I think I found the answer to my question. It's not a pm2 or npm thing, it seems to be a *nix way of saying "I'm done giving command options and want to start passing arguments": https://unix.stackexchange.com/questions/11376/what-does-double-dash-mean-also-known-as-bare-double-dash – Chris Schmitz Mar 25 '19 at 20:36
  • In theory, could `npm` be substituted for any other node-based bin module installed globally, and passed whatever arguments that module needs after ` -- ` the same way? – chamberlainpi Apr 25 '19 at 12:00
  • For me it throws an error in the logs: C:\DEV\NODEJS\NPM.CMD:1 0|weally | (function (exports, require, module, __filename, __dirname) { :: Created by npm, please don't edit manually. 0|weally | ^ 0|weally | 0|weally | SyntaxError: Unexpected token : 0|weally | at new Script (vm.js:74:7) similar issue here: https://github.com/Unitech/pm2/issues/3652 – Zied Hamdi Aug 14 '19 at 10:45
  • You can also use it as ```pm2 start --name "App Name" npm -- start``` – Mani Jan 29 '20 at 13:52
  • it didn't work in my case. Initially it ran but when I ran pm2 list, I got the status 'stopped' – KawaiKx Apr 09 '20 at 12:09
  • -- signifies the end of a command. So npm is the actual command and start is the args here. – Aswin Prasad Apr 15 '20 at 09:33
  • To run PM2 with `npm start` method and to give it a name `pm2 start npm --name "your_app_name" -- start` – Anish Nair May 09 '20 at 08:14
  • the two slashes what exactly are doing? – Maverick May 31 '21 at 10:21
  • @laukik-patel , What is the meaning of the two dashes " -- " in "pm2 npm -- start"? – dryleaf Aug 05 '21 at 06:26
172

Those who are using a configuration script like a .json file to run the pm2 process can use npm start or any other script like this -

my-app-pm2.json

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

Then simply -

pm2 start my-app-pm2.json

Edit - To handle the use case when you have this configuration script in a parent directory and want to launch an app in the sub-directory then use the cwd attribute.

Assuming our app is in the sub-directory nested-app relative to this configuration file then -

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

More detail here.

Jyotman Singh
  • 10,792
  • 8
  • 39
  • 55
  • 1
    how does this work if I want to run the start npm script from a parent folder? – Gianfranco P. Apr 03 '17 at 23:34
  • 1
    Could you elaborate a bit more? I assume you're asking *How to run* **npm start** *from outside the project directory?* . – Jyotman Singh Apr 04 '17 at 05:56
  • I'm using the configuration script to run multiple node apps that are in sub-folders. The package.json with the `start` script information is in one of them. See this gist: https://gist.github.com/gianpaj/04c5680a8275616aac5e46374e07f673 When I run this it doesn't know where `npm` should run from. Thx – Gianfranco P. Apr 04 '17 at 13:47
  • 3
    @GianfrancoP. You can use the `cwd` attribute. Check my edited answer :) – Jyotman Singh Apr 04 '17 at 14:34
  • I tried to use sudo npm and it shows access error to create a directory tough I have given all the permission to user as root and also running pm2 command as `sudo pm2 start config.json` – Mr X Oct 30 '17 at 10:51
  • How to start multi `npm start` with `pm2`? when I add call this another one will display error – SayJeyHi Feb 06 '19 at 07:51
  • How can i run something like `npm run server` or `npm run proxy`? Would change `args` with `server` be enough? – mhrabiee Jul 29 '20 at 12:20
  • Yes thank you! This should be in the pm2 docs! – Adam D Aug 14 '21 at 11:17
83

To use npm run

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

carkod
  • 1,844
  • 19
  • 32
  • Indeed, I agree with @Adiii , given that it can be run as an npm script, it just doesn't get any better than that! – Bartekus Feb 17 '21 at 22:08
56

I needed to run a specific npm script on my app in pm2 (for each env) In my case, it was when I created a staging/test service

The command that worked for me (the args must be forwarded that way):

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

examples:

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

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

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

Hope it helped

Tomer Omri
  • 921
  • 9
  • 6
  • 4
    notice that there is a space in between "-- run". Space needs to be there else you will get invalid option run. – virusrocks Jul 23 '20 at 02:59
50

Yes. Use pm2 start npm --no-automation --name {app name} -- run {script name}. It works. The --no-automation flag is there because without it PM2 will not restart your app when it crashes.

jcollum
  • 43,623
  • 55
  • 191
  • 321
45

you need to provide app name here like myapp

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

you can check it by

pm2 list

you can also add time

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

or

pm2 restart "id" --time

you can check logs by

pm2 log "id"

or

pm2 log "appName"

to get logs for all app

pm2 logs
Mike
  • 14,010
  • 29
  • 101
  • 161
Pharaj Ali
  • 691
  • 6
  • 6
  • Hi, @pharaj_ali, can you explain this part `-- run {script name}` ? I can't found it on the pm2 documentation. I've read on the edit history of your answer and I've found this interesting edit: `in case of different script name use run with script name and in case of start script no need to add run`. If I understand, using `run {script name}` is for multiple script and with only `npm start` it's more relevant to use `pm2 start npm --name {appName} -- start`? Plus I don't understand why the space between `--`and `start/run` any suggestions? Thanks – Yohan W. Dunon Jun 25 '21 at 14:38
  • 1
    Hi @YohanW.Dunon yes you are right while running npm, if we are using start script then we don't need to use run there ```npm start``` but in case of other script we use run like ```npm run {script name}``` for the case of space between ```--```, I think it is simply the way they use (not sure) let me know if you find answer for that – Pharaj Ali Jul 09 '21 at 11:41
37

I wrote shell script below (named start.sh). Because my package.json has prestart option. So I want to run npm start.

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

Then, start start.sh by pm2.

pm2 start start.sh --name appNameYouLike
peccu
  • 641
  • 5
  • 18
20

Yes we can, now pm2 support npm start, --name to species app name.

pm2 start npm --name "app" -- start
KARTHIKEYAN.A
  • 18,210
  • 6
  • 124
  • 133
15

You can change directory to your project

cd /my-project

then run

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

or

pm2 start "yarn start"

read more here

Nelson Frank
  • 169
  • 1
  • 5
13

See to enable clustering:

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

What do you think?

jdnichollsc
  • 1,520
  • 1
  • 24
  • 44
12

If you use PM2 via node modules instead of globally, you'll need to set interpreter: 'none' in order for the above solutions to work. Related docs here.

In ecosystem.config.js:

  apps: [
    {
      name: 'myApp',
      script: 'yarn',
      args: 'start',
      interpreter: 'none',
    },
  ],
Kevin Cooper
  • 5,018
  • 4
  • 37
  • 51
10

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

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

This worked for me when the others didnt

Luke Robertson
  • 1,592
  • 16
  • 21
  • 2
    Thank you so much, Luke. Especially appreciate that you posted your script alongside, no more guessing which "start" is which :) This should be rated higher, finally something that just works. – SMEETT Aug 14 '21 at 22:27
10

For the normal user

PM2 now supports npm start:

pm2 start npm -- start

To assign a name to the PM2 process, use the "--name" option:

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

For the root user

sudo pm2 start npm -- start

To assign a name to the PM2 process, use the "--name" option:

sudo pm2 start npm --name "your desired app name" -- start
Ashish Gupta
  • 1,153
  • 12
  • 14
7

Yes, Absolutely you can do it very efficiently by using a pm2 config (json) file with elegance.

package.json file (containing below example scripts)

"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"
  }

Suppose we want to run the script named as 'shivkumarscript' with pm2 utility. So, our pm2 config file should be like below, containing 'script' key with value as 'npm' and 'args' key with value as 'run '. Script name is 'shivkumarscript' in our case.

ecosystem.config.json file

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

Assuming that you have already installed Node.js, NPM and PM2 on your machine. Then below should be the command to start the application through pm2 which will in turn run the npm script (command line mentioned in your application's package.json file):

For production environment:

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

For development environment:

pm2 start ecosystem.config.js --only NodeServer

...And Boooom! guys

Shiv
  • 3,069
  • 1
  • 24
  • 17
2

It's working fine on CentOS 7

PM2 version 4.2.1

let's take two scenarios:

1. npm start //server.js

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

2. npm run main //main.js

pm2 start "npm -- run main" --name myMainFile
M. Hamza Rajput
  • 7,810
  • 2
  • 41
  • 36
2

To run PM2 with npm start method and to give it a name, run this,
pm2 start npm --name "your_app_name" -- start

To run it by passing date-format for logs,
pm2 start npm --name "your_name" --log-date-format 'DD-MM HH:mm:ss.SSS' -- start

Anish Nair
  • 3,238
  • 29
  • 41
1

Unfortunately, it seems that pm2 doesn't support the exact functionality you requested https://github.com/Unitech/PM2/issues/1317.

The alternative proposed is to use a ecosystem.json file Getting started with deployment which could include setups for production and dev environments. However, this is still using npm start to bootstrap your app.

snozza
  • 2,123
  • 14
  • 17
  • 1
    What do you mean by that? `However, this is still using npm start to bootstrap your app.` Can you actually run `npm start` using `pm2`? – xpepermint Sep 26 '15 at 12:48
1
pm2 start ./bin/www

can running

if you wanna multiple server deploy you can do that. instead of pm2 start npm -- start

劉謹賢
  • 19
  • 1
1

Don't forget the space before start

pm2 start npm --[space]start

so the correct command is:

pm2 start npm -- start
Hille
  • 2,123
  • 22
  • 39
Vidura Adikari
  • 549
  • 4
  • 7
0

Now, You can use after:

pm2 start npm -- start

Follow by https://github.com/Unitech/pm2/issues/1317#issuecomment-220955319

Minh Dao
  • 1
  • 1
  • Can you expand your answer? Advice from [How to answer](http://stackoverflow.com/help/how-to-answer): Links to external resources are encouraged, but please add context around the link so your fellow users will have some idea what it is and why it’s there. Always quote the most relevant part of an important link, in case the target site is unreachable or goes permanently offline. – moodboom Mar 25 '17 at 18:55
0

for this first, you need to create a file run.js and paste the below code on that.

const { spawn } = require('child_process');
//here npm.cmd for windows.for others only use npm
const workerProcess = spawn('npm.cmd', ['start']); 

  workerProcess.stdout.on('data', function (data) {  
      console.log('stdout: ' + data);  
   });  
 workerProcess.stderr.on('data', function (data) {  
      console.log('stderr: ' + data);  
   });  
 workerProcess.on('close', function (code) {  
      console.log('child process exited with code ' + code);  
   });  

and run this file with pm2.

pm2 start run.js 
  • List item
0

For my vite project on AWS EC2,

pm2 start npm -- run dev --host was only captured in the pm2 list but was not really running the npm run dev --host

I Had this error:

PM2        | 2023-09-03T02:36:50: PM2 log: Script /root/.nvm/versions/node/v18.17.1/bin/npm had too many unstable restarts (16). Stopped. "errored"
PM2        | 2023-09-03T02:37:01: PM2 log: App [npm:1] starting in -fork mode-
...
...

...So I swapped npm for yarn, so this worked in my case pm2 start yarn -- dev --host as it runs yarn dev --host