web-dev-qa-db-fra.com

Comment faire un travail cron avec PM2

Je souhaite créer un travail cron pour envoyer un courrier toutes les 15 minutes en prenant des données d'une table de base de données. Dans le nœud js, je peux effectuer un travail cron, mais à travers PM2, je ne comprends pas où placer le code et comment il fonctionne.

16
Milan Mahata

merci pour votre réponse; je le fais de cette façon et viens de définir l'email

  1. npm installer node-crontab

2 . Var crontab = require ('node-crontab');

var jobId = crontab.scheduleJob ("*/15 * * * *", function () { 

//This will call this function every 15 minutes

console.log("It's been 15 minutes!");

});

0
Milan Mahata

Utilisez l'option --cron:

-c --cron <cron_pattern>

Par exemple:

pm2 start sendMail.js --cron "*/15 * * * *"

Pm2 va maintenant redémarrer le script sendMail.js toutes les heures et 15, 30 et 45 minutes après l'heure

68
Robbie

C'est ce qui a fonctionné pour moi, J'ai divisé le cron dans un fichier différent qui s'exécute dans un processus différent car je veux libérer des ressources une fois l'exécution de cron terminée.

écosystèmes.config.js:

module.exports = {
  /**
   * Application configuration section
   * http://pm2.keymetrics.io/docs/usage/application-declaration/
   */
  apps: [

    // Main API Hosting
    {
      name: 'API',
      script: 'bin/www',
      env: {
        COMMON_VARIABLE: 'true'
      },
      instances: 1,
      exec_mode: 'cluster',
      watch: false,
      autorestart: true
    },
    {
      name: 'CRON',
      script: "crons/cronjob.js",
      instances: 1,
      exec_mode: 'fork',
      cron_restart: "0,30 * * * *",
      watch: false,
      autorestart: false
    }
  ]
};

Les lignes suivantes sont importantes dans l'exécutable cron

cron_restart: "0,30 * * * *" <- expression cron

autorestart: false <- important car sinon pm2 redémarrera immédiatement le cron après avoir terminé

Assurez-vous également que votre instances est 1, sinon plusieurs processus cron seront exécutés. 

Mises en garde principales:

Chaque fois que vous redémarrez tout pm2, le travail cron sera exécuté quelle que soit l'expression de cron. S'il est essentiel de ne l'exécuter qu'à des heures précises, ajoutez cette vérification supplémentaire au début du fichier cron.

if (new Date().getHours() !== 0 ) {
  console.log(`Current hours is ${new Date().getHours()}, not running.`)
  process.exit(0);
}
1
Sanket Berde

Si vous utilisez PM2 -osystems then, dans le fichier de configuration, ajoutez la séquence cron au paramètre script en le recouvrant de guillemets simples. Les doubles guillemets n'ont pas fonctionné pour moi.

module.exports = {
  apps : [{
    name        : "Send-mail",
    script      : "./sendMail.js --cron '*/15 * * * *'",
    watch       : true
  }]
}
1
Adam Bubela

Vous pouvez également utiliser le module node-schedule qui vous permet de définir des règles de style cron. Ensuite, vous pouvez exécuter le script à tout moment dans pm2.

0
Dan Watts