logo hsb.horse
← Zur Blog-Übersicht

Blog

Cron-Jobs mit PM2 erstellen: als Alternative zu launchd

Wie man unter macOS mit PM2 statt launchd Cron-artige Jobs erstellt. Eine kurze Zusammenfassung von Konfigurationsdatei und einem periodischen Beispiel mit Bun.

Veröffentlicht:

Ich wollte periodische Aufgaben unter macOS ausführen, aber die Konfiguration von launchd ist nach wie vor schwer lesbar, und ich wollte es einfacher haben. Deshalb habe ich mich für PM2 entschieden.

Konfiguration für einen Cron-Job mit PM2

Terminal window
cd $PROJECT_ROOT
pm2 ecosystem

Die Konfiguration wird in ecosystem.config.cjs verwaltet.

module.exports = {
apps: [
{
name: "cronJob",
script: "main.ts",
interpreter: "~/.bun/bin/bun",
// Anzahl der Instanzen ist 1
instances: 1,
// alle 15 Minuten starten
cron_restart: "*/15 * * * *",
exec_mode: "fork",
// bei Änderungen automatisch neu starten: nein
watch: false,
// automatischer Neustart: nein
autorestart: false,
},
],
};

Wichtige Punkte

  • cron_restart: legt das Intervall im Cron-Format fest
  • autorestart: false: da der Prozess als Cron-Job laufen soll, wird automatischer Neustart deaktiviert
  • interpreter: erlaubt die Angabe einer Laufzeit wie Bun

Startkommando:

Terminal window
pm2 start ecosystem.config.cjs
pm2 save

Beispiel für einen ausgeführten Job

Ein Prozess, der regelmäßig die IP-Adresse abruft und in einer Datenbank speichert.

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();

Referenzen

Zusammenfassung

Mit PM2 lassen sich Cron-Jobs mit einer deutlich einfacheren Konfiguration als mit launchd verwalten.

Wenn der Job in ecosystem.config.cjs definiert ist, kann man zusätzlich die Prozessverwaltungsfunktionen von PM2 für Logs und Neustarts nutzen.