logo hsb.horse
← Retour au blog

Blog

Créer un job Cron avec PM2 : comme alternative à launchd

Comment créer un job planifié avec PM2 sur macOS au lieu de launchd. Résumé du fichier de configuration et exemple d’exécution périodique avec Bun.

Publié:

Je voulais exécuter des traitements périodiques sur macOS, mais la configuration de launchd reste difficile à lire, et je voulais quelque chose de plus simple. J’ai donc choisi PM2.

Configuration pour exécuter un job Cron avec PM2

Terminal window
cd $PROJECT_ROOT
pm2 ecosystem

La configuration est gérée dans ecosystem.config.cjs.

module.exports = {
apps: [
{
name: "cronJob",
script: "main.ts",
interpreter: "~/.bun/bin/bun",
// nombre d’instances : 1
instances: 1,
// exécuter toutes les 15 minutes
cron_restart: "*/15 * * * *",
exec_mode: "fork",
// redémarrer automatiquement si les fichiers changent : non
watch: false,
// redémarrage automatique : non
autorestart: false,
},
],
};

Points clés

  • cron_restart: définit l’intervalle en format cron
  • autorestart: false: comme il s’agit d’un job planifié, le redémarrage automatique est désactivé
  • interpreter: permet de choisir le runtime, y compris Bun

Commande de démarrage :

Terminal window
pm2 start ecosystem.config.cjs
pm2 save

Exemple d’implémentation du job

Un traitement qui récupère périodiquement l’adresse IP et la stocke en base.

import { Database } from 'bun:sqlite';
const DDL = `CREATE TABLE IF NOT EXISTS ip_history (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ip TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);`
async function fetchIpConfig() {
const response = await fetch("https://ifconfig.io/ip").catch((err) => new Error(err));
if (response instanceof Error || !response.ok) {
return null;
}
const ip = await response.text();
return ip;
}
async function main() {
const ip = await fetchIpConfig();
if (ip == null) return;
using db = new Database('ip-monitor.sqlite', { create: true });
db.exec(DDL);
using query = db.query("INSERT INTO ip_history (ip) VALUES ($ip);");
query.run({ $ip: ip });
}
await main();

Références

Résumé

Avec PM2, on peut gérer des jobs planifiés avec une configuration plus simple que launchd.

En définissant le job dans ecosystem.config.cjs, on profite aussi des fonctions de gestion de processus de PM2 pour les logs et les redémarrages si nécessaire.