Monitor to check errored or stopped processes from pm2 and restart them

ecosystem.config.jsJavaScriptmonitor.jsJavaScript

ecosystem.config.js

module.exports = {
  apps: [
    {
      name: "fe-monitor",
      script: "./monitor.js",
      instances: 1,
      autorestart: true,
      watch: false,
      max_memory_restart: "200M",
    },
  ],
};

monitor.js

const { exec } = require("child_process");

// Function to check the status of all apps and reload any down apps
function checkAndReloadApps() {
  exec("pm2 jlist", (error, stdout, stderr) => {
    if (error) {
      console.error(`Error executing pm2 jlist: ${error.message}`);
      return;
    }

    if (stderr) {
      console.error(`Error: ${stderr}`);
      return;
    }

    try {
      const apps = JSON.parse(stdout);
      apps.forEach((app) => {
        const appName = app.name;
        const appStatus = app.pm2_env.status;

        if (appStatus !== "online") {
          console.log(
            `App ${appName} is ${appStatus}. Attempting to reload...`
          );
          exec(
            `pm2 reload ${appName}`,
            (reloadError, reloadStdout, reloadStderr) => {
              if (reloadError) {
                console.error(
                  `Error reloading app ${appName}: ${reloadError.message}`
                );
                return;
              }
              if (reloadStderr) {
                console.error(`Error reloading ${appName}: ${reloadStderr}`);
                return;
              }
              console.log(`App ${appName} reloaded successfully.`);
            }
          );
        }
      });
    } catch (parseError) {
      console.error(`Error parsing pm2 jlist output: ${parseError.message}`);
    }
  });
}

// Schedule the check every 5 seconds using setInterval
setInterval(checkAndReloadApps, 5000);

console.log("PM2 app monitoring script is running...");
Updated: 11/25/2024