Nápověda a návodyHeartbeat (cron monitoring) › Přidání do cron jobu (bash, Python, Node)

Přidání do cron jobu (bash, Python, Node)

4 min čtení · Heartbeat (cron monitoring)

Cíl: Přidat heartbeat URL do existujícího cron jobu nebo skriptu, aby ePulz.io dostával "jsem živý" ping po každém úspěšném běhu.

Princip

Heartbeat URL voláte po úspěšném dokončení úlohy. Pokud skript selže, URL se nezavolá, ePulz.io si všimne chybějící ping a pošle vám alert.

Bash / shell cron

Přidejte curl volání na konec svého cron řádku spojené operátorem &&:

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

Flagy curl:

  • -f = fail na non-2xx response (curl vrátí error)
  • -s = silent (nepíše progress)
  • -S = ale ukáže errors (kombinace s -s)
  • -m 10 = max-time 10 sekund (timeout)
  • > /dev/null = response nezahltí cron log

Python

Pro Python skripty přidejte volání přes requests nebo urllib:

import os
import requests

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

def sync_data():
    # ... vaše logika ...
    pass

try:
    sync_data()
    # Heartbeat se pošle pouze pokud sync_data() neraisne exception
    if HEARTBEAT_URL:
        requests.get(HEARTBEAT_URL, timeout=10)
except Exception as e:
    # Heartbeat se nepošle - ePulz.io vás upozorní
    print(f"Sync failed: {e}")
    raise

Bez externí knihovny, jen se standardní:

import urllib.request

# Po úspěšném dokončení úlohy
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 až po úspěšném dokončení
  await fetch(HEARTBEAT_URL, { signal: AbortSignal.timeout(10000) });
}

nightlyJob().catch(err => {
  console.error(err);
  process.exit(1);  // Heartbeat se nepošle, ePulz.io vás upozorní
});

Docker / systemd timer

Pro systemd timer, přidejte ExecStartPost do .service souboru:

# /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 se spustí pouze pokud ExecStart byl úspěšný.

PHP / Laravel scheduler

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

Laravel má vestavěnou metodu thenPing() přesně pro tento účel.

Pokročilé: ping na začátku i konci

Pro důkladnější detekci můžete poslat i "start" ping (úloha se spustila) - rozlišíte tím "úloha vůbec nezačala" od "úloha se zasekla":

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

# Vaše úloha
/usr/local/bin/backup.sh
EXIT_CODE=$?

# Done ping s exit code
curl -fsS -m 10 "https://epulz.io/heartbeat/Qs78OPNIIsCF_-Vj?exit=$EXIT_CODE" > /dev/null

Test - simulace jednoho běhu

Před zařazením do cronu otestujte URL ručně:

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

Po úspěšném volání v ePulz.io dashboardu uvidíte stav monitoru přejít z Pending na OK.