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 adresu do existující cron úlohy nebo skriptu, aby ePulz.io dostával ping "jsem naživu" po každém úspěšném běhu.

Princip

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

Bash / shell cron

Přidejte volání curl na konec cron řádku, spojené operátorem && (spustí se jen při úspěchu předchozího příkazu):

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

Význam přepínačů curl:

  • -f = selhat při chybové odpovědi (curl vrátí chybu)
  • -s = tiše (nepíše průběh)
  • -S = ale zobrazí chyby (kombinace s -s)
  • -m 10 = časový limit 10 sekund
  • > /dev/null = odpověď nezahltí cron log

Python

Pro Python skripty přidejte volání přes knihovnu requests nebo standardní 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 jen pokud sync_data() nespadne s chybou
    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

Při použití systemd timeru přidejte do .service souboru řádek ExecStartPost:

# /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í jen tehdy, pokud ExecStart doběhl ú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.

Test - simulace jednoho běhu

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

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

Po úspěšném volání v přehledu ePulz.io uvidíte, jak stav monitoru přejde z Čeká se na OK.

Byl tento návod užitečný?