Pomoc i poradnikiHeartbeat (monitoring cron) › Dodanie do cron job (bash, Python, Node)

Dodanie do cron job (bash, Python, Node)

4 min czytania · Heartbeat (monitoring cron)

Cel: Dodać heartbeat URL do istniejącego cron job lub skryptu, aby ePulz.io otrzymywał ping "żyję" po każdym udanym przebiegu.

Zasada

Heartbeat URL wywołujesz po udanym zakończeniu zadania. Jeśli skrypt zawiedzie, URL nie zostanie wywołany, ePulz.io zauważy brakujący ping i wyśle Ci alert.

Bash / shell cron

Dodaj wywołanie curl na końcu swojego wiersza cron połączone operatorem &&:

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

Flagi curl:

  • -f = fail na non-2xx response (curl zwraca error)
  • -s = silent (nie pisze progress)
  • -S = ale pokaże errors (kombinacja z -s)
  • -m 10 = max-time 10 sekund (timeout)
  • > /dev/null = response nie zaśmieci cron log

Python

Dla skryptów Python dodaj wywołanie przez requests lub urllib:

import os
import requests

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

def sync_data():
    # ... twoja logika ...
    pass

try:
    sync_data()
    # Heartbeat wyśle się tylko jeśli sync_data() nie podniesie exception
    if HEARTBEAT_URL:
        requests.get(HEARTBEAT_URL, timeout=10)
except Exception as e:
    # Heartbeat się nie wyśle - ePulz.io Cię powiadomi
    print(f"Sync failed: {e}")
    raise

Bez biblioteki zewnętrznej, tylko ze standardową:

import urllib.request

# Po udanym zakończeniu zadania
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 dopiero po udanym zakończeniu
  await fetch(HEARTBEAT_URL, { signal: AbortSignal.timeout(10000) });
}

nightlyJob().catch(err => {
  console.error(err);
  process.exit(1);  // Heartbeat się nie wyśle, ePulz.io Cię powiadomi
});

Docker / systemd timer

Dla systemd timer, dodaj ExecStartPost do pliku .service:

# /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 uruchamia się tylko, jeśli ExecStart był udany.

PHP / Laravel scheduler

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

Laravel ma wbudowaną metodę thenPing() dokładnie do tego celu.

Zaawansowane: ping na początku i końcu

Dla dokładniejszej detekcji możesz wysłać też ping "start" (zadanie się uruchomiło) - rozróżnisz przez to "zadanie w ogóle nie zaczęło" od "zadanie się zacięło":

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

# Twoje zadanie
/usr/local/bin/backup.sh
EXIT_CODE=$?

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

Test - symulacja jednego przebiegu

Przed dodaniem do cron przetestuj URL ręcznie:

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

Po udanym wywołaniu w dashboardzie ePulz.io zobaczysz stan monitora przechodzący z Pending na OK.