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