Hilfe und AnleitungenHeartbeat (Cron-Monitoring) › Zu Cron-Job hinzufügen

Zu Cron-Job hinzufügen

4 Min. Lesezeit · Heartbeat (Cron-Monitoring)

Ziel: Eine Heartbeat-URL zu einem bestehenden Cron-Job oder Skript hinzufügen, damit ePulz.io nach jedem erfolgreichen Lauf einen "Ich bin am Leben"-Ping erhält.

Prinzip

Die Heartbeat-URL rufen Sie nach erfolgreichem Abschluss der Aufgabe auf. Wenn das Skript fehlschlägt, wird die URL nicht aufgerufen, ePulz.io bemerkt den fehlenden Ping und sendet Ihnen eine Benachrichtigung.

Bash / Shell-Cron

Fügen Sie den curl-Aufruf am Ende Ihrer Cron-Zeile hinzu, verbunden mit dem Operator &&:

# /etc/crontab oder crontab -e
0 3 * * * /usr/local/bin/backup.sh && curl -fsS -m 10 \
  https://epulz.io/heartbeat/Qs78OPNIIsCF_-Vj > /dev/null

Curl-Flags:

  • -f = Fail bei non-2xx Response (curl gibt Fehler zurück)
  • -s = Silent (zeigt keinen Progress)
  • -S = aber zeigt Errors (Kombination mit -s)
  • -m 10 = max-time 10 Sekunden (Timeout)
  • > /dev/null = Response überflutet das Cron-Log nicht

Python

Für Python-Skripte fügen Sie den Aufruf über requests oder urllib hinzu:

import os
import requests

HEARTBEAT_URL = os.environ.get("HEARTBEAT_URL")

def sync_data():
    # ... Ihre Logik ...
    pass

try:
    sync_data()
    # Heartbeat wird nur gesendet, wenn sync_data() keine Exception wirft
    if HEARTBEAT_URL:
        requests.get(HEARTBEAT_URL, timeout=10)
except Exception as e:
    # Heartbeat wird nicht gesendet - ePulz.io benachrichtigt Sie
    print(f"Sync failed: {e}")
    raise

Ohne externe Bibliothek, nur mit der Standardbibliothek:

import urllib.request

# Nach erfolgreichem Abschluss der Aufgabe
urllib.request.urlopen("https://epulz.io/heartbeat/Qs78OPNIIsCF_-Vj", timeout=10)

Node.js

const HEARTBEAT_URL = process.env.HEARTBEAT_URL;

async function nightlyJob() {
  await processInvoices();
  // Heartbeat erst nach erfolgreichem Abschluss
  await fetch(HEARTBEAT_URL, { signal: AbortSignal.timeout(10000) });
}

nightlyJob().catch(err => {
  console.error(err);
  process.exit(1);  // Heartbeat wird nicht gesendet, ePulz.io benachrichtigt Sie
});

Docker / systemd-Timer

Für systemd-Timer fügen Sie ExecStartPost zur .service-Datei hinzu:

# /etc/systemd/system/db-backup.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
ExecStartPost=/usr/bin/curl -fsS -m 10 https://epulz.io/heartbeat/Qs78OPNIIsCF_-Vj

ExecStartPost wird nur ausgeführt, wenn ExecStart erfolgreich war.

PHP / Laravel Scheduler

// app/Console/Kernel.php
$schedule->command('backup:run')
    ->daily()
    ->thenPing('https://epulz.io/heartbeat/Qs78OPNIIsCF_-Vj');

Laravel hat eine eingebaute Methode thenPing() genau für diesen Zweck.

Fortgeschritten: Ping am Anfang und am Ende

Für eine gründlichere Erkennung können Sie auch einen "Start"-Ping senden (die Aufgabe wurde gestartet) - so unterscheiden Sie "Aufgabe hat überhaupt nicht begonnen" von "Aufgabe hat sich aufgehängt":

# Start-Ping
curl -fsS -m 10 https://epulz.io/heartbeat/Qs78OPNIIsCF_-Vj/start > /dev/null

# Ihre Aufgabe
/usr/local/bin/backup.sh
EXIT_CODE=$?

# Done-Ping mit Exit-Code
curl -fsS -m 10 "https://epulz.io/heartbeat/Qs78OPNIIsCF_-Vj?exit=$EXIT_CODE" > /dev/null

Test - Simulation eines Laufs

Vor der Einreihung in cron testen Sie die URL manuell:

$ curl -fsS https://epulz.io/heartbeat/Qs78OPNIIsCF_-Vj
OK

Nach einem erfolgreichen Aufruf sehen Sie im ePulz.io-Dashboard, wie der Monitor-Status von Pending zu OK wechselt.