Pomoc a návodyHeartbeat (cron monitoring) › Pridanie do cron jobu (bash, Python, Node)

Pridanie do cron jobu (bash, Python, Node)

4 min čítania · Heartbeat (cron monitoring)

Cieľ: Pridať heartbeat URL do existujúceho cron jobu alebo skriptu, aby ePulz.io dostával "som živý" ping po každom úspešnom behu.

Princíp

Heartbeat URL voláte po úspešnom dokončení úlohy. Ak skript zlyhá, URL sa nezavolá, ePulz.io si všimne chýbajúci ping a pošle vám alert.

Bash / shell cron

Pridajte curl volanie na koniec svojho cron riadku spojené operátorom &&:

# /etc/crontab alebo 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áti error)
  • -s = silent (nepíše progress)
  • -S = ale ukáže errors (kombinácia s -s)
  • -m 10 = max-time 10 sekúnd (timeout)
  • > /dev/null = response nezahltí cron log

Python

Pre Python skripty pridajte volanie cez requests alebo urllib:

import os
import requests

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

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

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

Bez externej knižnice, len so štandardnou:

import urllib.request

# Po úspešnom 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 úspešnom dokončení
  await fetch(HEARTBEAT_URL, { signal: AbortSignal.timeout(10000) });
}

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

Docker / systemd timer

Pre systemd timer, pridajte ExecStartPost do .service súboru:

# /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 sa spustí iba ak ExecStart bol úspešný.

PHP / Laravel scheduler

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

Laravel má vstavanú metódu thenPing() presne pre tento účel.

Pokročilé: ping na začiatku aj konci

Pre dôkladnejšiu detekciu môžete poslať aj "start" ping (úloha sa spustila) - rozlíšite tým "úloha vôbec nezačala" od "úloha sa zasekla":

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

# Vaša ú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 - simulácia jedného behu

Pred zaradením do cronu otestujte URL ručne:

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

Po úspešnom volaní v ePulz.io dashbarde uvidíte stav monitora prejsť z Pending na OK.