How can I check if my pm2 app NODE_ENV is getting set?

46,612

Solution 1

To answer the actual question in the title:

Within your script, for me my Express app's app.js file, you can use process.env.NODE_ENV to get the current value of NODE_ENV and log that out if you want.

An even better way is to use PM2's Process Metrics module, aka pmx.

yarn add pmx

or

npm install pmx --save

then

const Probe = require('pmx').probe()

Probe.metric({
  name    : 'NODE_ENV',
  value   : function() {
    return process.env.NODE_ENV
  }
})

Now it will show up in calls to pm2 monit (bottom left).


To change your environment:

It is necessary that you kill and restart the process to change your environment.

$ pm2 kill && pm2 start pm2.json --env production

The following isn't good enough:

pm2 restart pm2.json --env production

Solution 2

You can also check your NODE_ENV via running pm2 show <yourServerName>. This will output info about your running server including node env.

In addition, you can check your environment variables via running pm2 env 0. This will show all the environment variables for the running node process.

Solution 3

Start it with npm by adding this to your package.json:

"scripts": {
  "myScript": "NODE_ENV=production pm2 start server.js"
}

Then

npm start myScript

You can do it directly too, but this is easy to manage, automate wth crontab and is in your source control...

Solution 4

Your process.json file is incomplete. Try using something like this:

[process.json]
{
  "name" : "MyApp",
  "script" : "myapp.js",
  "env_production" : {
    "NODE_ENV": "production"
  }
}

Then add logging into your code, preferably somwhere on startup:

console.log("NODE_ENV : ", process.env.NODE_ENV);

Now start the application:

pm2 start process.json --env production

Lastly watch app logs:

pm2 logs MyApp

This should do it.

Solution 5

May be at the start of your server script you can print the value of the environment variable and then check the PM2 logs. Use the following code to print your environment variable value:

console.log('process.env.NODE_ENV:', process.env.NODE_ENV);

And then use the following code to see the PM2 logs

pm2 logs app_name

Here app_name is your process name as indicated by the entry in the process.json file.

Share:
46,612
Kenmore
Author by

Kenmore

Updated on July 09, 2022

Comments

  • Kenmore
    Kenmore almost 2 years

    So I just deployed a site with node and pm2 for the first time and I'm going back and doing some optimization and reading best practices, etc.

    I read that you can get a lot of benefit by setting NODE_ENV=production.

    I found this in the pm2 docs:

    [process.json]
    "env_production" : {
      "NODE_ENV": "production"
    }
    
    ...
    
    $ pm2 start process.json --env production
    

    So, I did it but I have no idea if it is working. While trying to figure out how to check it I learned to try:

    $ node
    > process.env.NODE_ENV
    > undefined
    

    So, that's not a good sign.. but, with my limited understanding of how the low level stuff works, I can guess that maybe pm2 launches each app as a separate node process? So maybe I'm not in the right process when I try to check it.

    Also, I don't know if I have to make a new ~/.pm2/dump.pm2 file because maybe whenever that is maybe overriding the options I set? (because I used pm2 startup).

    How do I check if my pm2 app's NODE_ENV is set?

    • Roman Stetsyshin
      Roman Stetsyshin almost 8 years
      $ node > process.env.NODE_ENV will show you nothing because in this case you run pure node, not pm2
  • Kenmore
    Kenmore almost 8 years
    OK, I tried that and I still get undefined. So what am I doing wrong? Should I try to wipe my startup script and start over?
  • Kenmore
    Kenmore almost 8 years
    No, I had a complete json config file, that was just a snippet.
  • cpz
    cpz about 7 years
    You should know that you are a savior @Zuko. You pm2 killed it, and that was absolutely necessary.
  • Emilio
    Emilio about 6 years
    Thanks for the "NODE_ENV=production" part at the beggining! It works with "NODE_ENV=production pm2 start npm -- start" directly in the terminal.
  • Flyn Sequeira
    Flyn Sequeira over 5 years
    How do you set custom env variables in pm2 production? For eg. I want to set process.env.MONGODB_URI.
  • Kenmore
    Kenmore over 5 years
    @FlynSequeira You can do that in your config file (this can be a .json file like the pm2.json in my example or in the docs they call it the ecosystem file: ecosystem.config.js). pm2.io/doc/en/runtime/guide/ecosystem-file . There is probably a way to do this in the CLI as well, just look at the CLI page of the docs.
  • BartusZak
    BartusZak almost 5 years
    pm2 kill is that what I was looking for :)
  • Christopher Jones
    Christopher Jones almost 3 years
    Out of interest, why did you prefer setting LD_LIBRARY_PATH to using ldconfig as shown in the installation instructions? Using ldconfig can save various hassles.
  • lookyhooky
    lookyhooky over 2 years
    This should be the accepted answer. It explains how to use the commands of pm2 to show all environment variables for a running app.