node.js - guide - Cómo hacer un trabajo cron con PM2
pm2 kill (5)
Esto es lo que funcionó para mí, dividí el cron en un archivo diferente que se ejecuta en un proceso diferente porque quiero liberar recursos después de que el cron haya finalizado la ejecución.
ecosistema.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
}
]
};
Las siguientes líneas son importantes en el ejecutable cron.
cron_restart: "0,30 * * * *"
<- expresión cron
autorestart: false
<- importante porque, de lo contrario, pm2 reiniciará el cron una vez finalizado inmediatamente
También asegúrese de que sus instances
sean 1 de lo contrario, se ejecutarán múltiples procesos cron.
Advertencias clave:
Cada vez que reinicia todo pm2, el trabajo cron se ejecutará independientemente de la expresión cron. Si es crítico ejecutarlo solo en momentos específicos, agregue esta comprobación adicional al comienzo del archivo cron
if (new Date().getHours() !== 0 ) {
console.log(`Current hours is ${new Date().getHours()}, not running.`)
process.exit(0);
}
Quiero hacer un trabajo cron para enviar correo cada 15 minutos tomando datos de una tabla de base de datos. En el nodo js puedo hacer un trabajo cron, pero a través de PM2 no entiendo dónde colocar el código y cómo funciona.
Gracias por su respuesta; Lo hago de esta manera y solo configuro el correo electrónico.
- npm instalar 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!");
});
Si utiliza el ecosistema PM2, a continuación, en el archivo de configuración, agregue la secuencia cron al parámetro de script
envolviéndolo con comillas simples. De alguna manera, las comillas dobles no funcionaron para mí.
module.exports = {
apps : [{
name : "Send-mail",
script : "./sendMail.js --cron ''*/15 * * * *''",
watch : true
}]
}
alternativamente (mi preferencia)
module.exports = {
apps : [{
name : "Send-mail",
script : "./sendMail.js",
cron_restart: "*/15 * * * *",
watch : true
}]
}
También puede usar el módulo de programación de nodos que le permite definir reglas de estilo cron. Luego, puede ejecutar el programa normalmente en pm2, lo uso con PM2 para muchos proyectos y nunca me ha fallado.
var schedule = require(''node-schedule'');
var rule = new schedule.RecurrenceRule();
rule.hour = [10]; // 10am
rule.minute = [0]; // 0mins
var job = schedule.scheduleJob(rule, function(){
console.log("10am every day")
});
//Rule 2 - 6am every wednesday
var rule2 = new schedule.RecurrenceRule();
rule2.dayOfWeek = 3; // 0 = Sunday
rule2.hour = 6;
rule2.minute = 0;
var job2 = schedule.scheduleJob(rule2, function(){
console.log("Every Wednesday @ 6am");
});
var rule3 = new schedule.RecurrenceRule();
rule3.minute = [0, 15, 30, 45]; // Specific Minutes
var job3 = schedule.scheduleJob(rule3, function(){
console.log("Run at specific minutes")
});
También es compatible con las reglas de estilo CRON, pero prefiero el método anterior.
Consulte la documentación en https://www.npmjs.com/package/node-schedule
Usa la opción --cron
:
-c --cron
<cron_pattern>
Por ejemplo:
pm2 start sendMail.js --cron "*/15 * * * *"
Pm2 ahora reiniciará el script sendMail.js
a la hora, y a los 15, 30 y 45 minutos después de la hora