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
cd $PROJECT_ROOT
pm2 ecosystemLa 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 :
pm2 start ecosystem.config.cjs
pm2 saveExemple 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
- PM2 - Ecosystem File
- PM2でCronジョブを作成する方法 | NullNull
- How to make a task job with PM2? - Stack Overflow
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.
hsb.horse