Can pm2 run an 'npm start' script - node.js

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" ./

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

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.

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

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

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.

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

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

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

See to enable clustering:
pm2 start npm --name "AppName" -i 0 -- run start
What do you think?

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',
},
],

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

You can change directory to your project
cd /my-project
then run
pm2 start "npm run start" \\ run npm script from your package.json
read more here

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

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

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

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.

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

Don't forget the space before start
pm2 start npm --[space]start
so the correct command is:
pm2 start npm -- start

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

Now, You can use after:
pm2 start npm -- start
Follow by https://github.com/Unitech/pm2/issues/1317#issuecomment-220955319

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

Related

How to use pm2 start npm in a specific directory?

Is there a CLI tag for running pm2 start npm -- start in a specific directory? I looked around but could not find an answer.
On the other hand, when I run pm2 without npm, I can specify which directory I want to run pm2 in. For example:
pm2 start /opt/www/myapp/index.js
Is there any way to add a path tag to the pm2 start npm -- start command?
You can use something like this:
cd /directory/of/my/app ; pm2 start npm -- start
You can also write an ecosystem file to parameter you app:
{
"apps": [
{
"name": "my-app",
"cwd": "/path/to/app",
"script": "npm",
"args": "start"
}
]
}
To generate an empty ecosystem file:
pm2 init simple
this will generate a file named ecosystem.config.js that you can rename.
Then to start application:
pm2 start ecosystem.config.js
ecosystem doc: https://pm2.keymetrics.io/docs/usage/application-declaration/

How run pm2 with special script for prod env?

I already have the dev app run on pm2.
I wanna add the app for production.
I have a script in the package:
"scripts": {
"pm2-start-prod": "set NODE_ENV=production&& pm2 start app.js",
...
}
I tried to run pm2 start "npm run pm2-start-prod" --name backend-prod
But in pm2 appear 2 new instance app and backend-prod.
Both don't work the app logs shows 8082 port already used
backend-prod can't run script pm2-start-prod
I know I should use ecosystem, but I don't understand how.
What I did do wrong?
I think this should be working
pm2 start "whatEverScript" --name whateverName
in your case this correct
pm2 start "npm run pm2-start-prod" --name backend-prod
I think the problem in your script it should be something like this
"scripts": {
"pm2-start-prod": "set NODE_ENV=production&& node app.js",
...
}

Run node server with PM2

How could I run node server.js -p by pm2?
Scripts of my package.json is like below,
"scripts": {
"dev": "node server.js",
"start": "node server.js -p"
},
When I execute npm start everything work truly. But I want to run this command with pm2.
To do it when I run pm2 start npm -- start, the process will add to the list of the pm2 but my app not run!
the correct command is
pm2 start server.js
or if you want to pass -p to your app and a name
pm2 start server.js --name "my-server" -- -p

how to run "npm start" by PM2?

I have seen many questions here but that was not working for me. That why asking this question?
I am using DigitalOcean Ubuntu 16.04 server. I have a node project run by "npm start".
Script is:
"scripts": {
"start": "node ./bin/www"
}
generally pm2 work for
pm2 start app.js
As my script is like this and run by npm start how can I run my server forever.
You can run built-in npm scripts like this:
pm2 start npm -- start
If you have a custom script, you can run like this:
pm2 start npm -- run custom
--
In your case, pm2 start npm -- start would run node ./bin/www. Change the start script to node app.js if you want to run node app.js.
Yes, 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
My application is called 'app.js'. I have the exact same start script for an express Node.js application.
And after googling tons this solved my problem, instead of calling pm2 start app.js.
pm2 start ./bin/www
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

How to start a package.json script in pm2

I want to demonise my express js graphql api server. In windows local dev, I can start my server by running this command and it works fine:
yarn dev
This start command is defined in my package.json like this:
"scripts": {
"dev": "cross-env NODE_ENV=development DEBUG=express:* nodemon --exec babel-node src/index.js"
},
When I try to start this in pm2 in my linux server, I get a success like this:
latheesan#app:~/apps/tweet/server$ pm2 start yarn -- dev
[PM2] Starting /usr/bin/yarn in fork_mode (1 instance)
[PM2] Done.
However, when I type pm2 status it says error and also the display looks really odd:
I am running this on Ubuntu 16.04.
If I don't use the pm2 and just start the app in my ubuntu server with yarn dev - it runs fine.
Any ideas?
Pm2 now support npm
$ pm2 start --interpreter babel-node server.js
(or)
$ pm2 start npm --start
(or)
$ pm2 start npm --name "myAPP" --start
(or)
$ pm2 start npm --name "{app_name}" --run "{script_name}"
I have now resolved this issue.
Install the babel-node globally via: npm install -g babel-cli
Then create the pm2 config in json: pm2.json
{
"apps": [
{
"name": "Tweet GraphQL Server",
"exec_interpreter": "babel-node",
"script": "index.js",
"merge_logs": true,
"cwd": "./src",
"env": {
"NODE_ENV": "production"
}
}
]
}
Now I can run this command to start the pm2 process: pm2 start pm2.json
i do this in my app like this:
in package.json:
"scripts": {
"start": "... start application script ...",
"start:dev": "... start application script as development mode ...",
"pm2": "pm2 start npm --name \"CustomeNameForPM2\" -- run start --watch",
"pm2:dev": "pm2 start npm --name \"CustomeNameForPM2\" -- run start:dev --watch"
}
now you can run pm2 easy with npm run pm2 or npm run pm2:dev
but if you like to do something better, you can read pm2 documentation and use pm2 ecosystem config file

Resources