Reputation: 24398
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" ./
Upvotes: 446
Views: 651837
Reputation: 185
Working command for pm2: (Works in 2024)
sudo pm2 start npm --name "name_of_app" -- run dev
My package.json have,
"scripts": {
"dev": " set PORT=3999 && react-scripts start",
},
Explanation:
npm: Tells PM2 to run an npm script.
--name "name_of_app": Assigns a custom name to the PM2 process for easier management.
run dev: Executes the dev script from your package.json
Upvotes: 2
Reputation: 5395
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
:
module.exports = {
apps: [
{
name: 'myApp',
script: 'yarn',
args: 'start',
interpreter: 'none',
},
],
}
Upvotes: 13
Reputation: 510
if anyone has to pass any other script with a name here's how to do it.
pm2 start "npm run dev" --name myAppName
Upvotes: 8
Reputation: 455
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
✅
Upvotes: 2
Reputation: 333
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
Upvotes: 19
Reputation: 31
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
Upvotes: 0
Reputation: 3285
Yes, Absolutely you can do it very efficiently by using a pm2 config (json) file with elegance.
"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.
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
Upvotes: 10
Reputation: 731
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
Upvotes: 47
Reputation: 1241
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
Upvotes: 11
Reputation: 9513
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
Upvotes: 892
Reputation: 3368
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
Upvotes: 2
Reputation: 1091
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
Upvotes: 66
Reputation: 10296
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
Upvotes: 2
Reputation: 1652
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
Upvotes: 11
Reputation: 648
Don't forget the space before start
pm2 start npm --[space]start
so the correct command is:
pm2 start npm -- start
Upvotes: 2
Reputation: 19
pm2 start ./bin/www
can running
if you wanna multiple server deploy you can do that. instead of pm2 start npm -- start
Upvotes: 1
Reputation: 2230
To use npm run
pm2 start npm --name "{app_name}" -- run {script_name}
Upvotes: 102
Reputation: 20158
Yes we can, now pm2 support npm start, --name to species app name.
pm2 start npm --name "app" -- start
Upvotes: 20
Reputation: 46613
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.
Upvotes: 54
Reputation: 11350
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.
Upvotes: 183
Reputation: 1
Now, You can use after:
pm2 start npm -- start
Follow by https://github.com/Unitech/pm2/issues/1317#issuecomment-220955319
Upvotes: 0
Reputation: 1569
See to enable clustering:
pm2 start npm --name "AppName" -i 0 -- run start
What do you think?
Upvotes: 14
Reputation: 641
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
Upvotes: 37
Reputation: 2253
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.
Upvotes: 1