Guida e tutorialHeartbeat (cron monitoring) › Aggiungi al cron job

Aggiungi al cron job

4 min di lettura · Heartbeat (cron monitoring)

Obiettivo: aggiungere l'URL heartbeat a un cron job o script esistente, in modo che ePulz.io riceva un ping "sono vivo" dopo ogni esecuzione riuscita.

Principio

Chiami l'URL heartbeat dopo il completamento con successo dell'attività. Se lo script fallisce, l'URL non viene chiamato, ePulz.io nota il ping mancante e ti invia un alert.

Cron bash / shell

Aggiungi la chiamata curl alla fine della tua riga cron unita con l'operatore &&:

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

Flag di curl:

  • -f = fail con una response non 2xx (curl restituisce errore)
  • -s = silent (non stampa il progress)
  • -S = ma mostra gli errori (combinato con -s)
  • -m 10 = max-time 10 secondi (timeout)
  • > /dev/null = la response non riempie il log di cron

Python

Per gli script Python aggiungi la chiamata tramite requests o urllib:

import os
import requests

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

def sync_data():
    # ... la tua logica ...
    pass

try:
    sync_data()
    # L'heartbeat viene inviato solo se sync_data() non solleva eccezioni
    if HEARTBEAT_URL:
        requests.get(HEARTBEAT_URL, timeout=10)
except Exception as e:
    # L'heartbeat non viene inviato - ePulz.io ti avvisa
    print(f"Sync failed: {e}")
    raise

Senza libreria esterna, solo con la standard:

import urllib.request

# Dopo il completamento con successo dell'attività
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 solo dopo il completamento con successo
  await fetch(HEARTBEAT_URL, { signal: AbortSignal.timeout(10000) });
}

nightlyJob().catch(err => {
  console.error(err);
  process.exit(1);  // L'heartbeat non viene inviato, ePulz.io ti avvisa
});

Docker / systemd timer

Per il timer systemd aggiungi ExecStartPost al file .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 viene eseguito solo se ExecStart è andato a buon fine.

PHP / Laravel scheduler

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

Laravel ha il metodo integrato thenPing() esattamente per questo scopo.

Avanzato: ping all'inizio e alla fine

Per un rilevamento più accurato puoi inviare anche un ping "start" (l'attività è partita) - in questo modo distingui "l'attività non è proprio partita" da "l'attività si è bloccata":

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

# La tua attività
/usr/local/bin/backup.sh
EXIT_CODE=$?

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

Test - simulazione di una singola esecuzione

Prima di inserirlo nel cron prova l'URL manualmente:

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

Dopo la chiamata riuscita, nella dashboard di ePulz.io vedrai lo stato del monitor passare da Pending a OK.