Ayuda y guíasHeartbeat (cron monitoring) › Añadir al cron job (bash, Python, Node)

Añadir al cron job (bash, Python, Node)

4 min de lectura · Heartbeat (cron monitoring)

Objetivo: Añadir la URL heartbeat a un cron job o script existente para que ePulz.io reciba un ping "estoy vivo" tras cada ejecución exitosa.

Principio

La URL heartbeat se llama tras la finalización exitosa de la tarea. Si el script falla, la URL no se llama, ePulz.io nota la falta de ping y le envía una alerta.

Bash / shell cron

Añada una llamada curl al final de su línea cron unida con el operador &&:

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

Flags de curl:

  • -f = falla con response non-2xx (curl devuelve error)
  • -s = silent (no muestra el progreso)
  • -S = pero muestra los errores (combinación con -s)
  • -m 10 = max-time 10 segundos (timeout)
  • > /dev/null = la respuesta no inunda el log de cron

Python

Para scripts en Python añada la llamada mediante requests o urllib:

import os
import requests

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

def sync_data():
    # ... su lógica ...
    pass

try:
    sync_data()
    # El heartbeat se envía solo si sync_data() no lanza una excepción
    if HEARTBEAT_URL:
        requests.get(HEARTBEAT_URL, timeout=10)
except Exception as e:
    # El heartbeat no se envía: ePulz.io le avisará
    print(f"Sync failed: {e}")
    raise

Sin librerías externas, solo con la estándar:

import urllib.request

# Tras la finalización exitosa de la tarea
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 tras la finalización exitosa
  await fetch(HEARTBEAT_URL, { signal: AbortSignal.timeout(10000) });
}

nightlyJob().catch(err => {
  console.error(err);
  process.exit(1);  // El heartbeat no se envía, ePulz.io le avisará
});

Docker / systemd timer

Para un timer de systemd, añada ExecStartPost al archivo .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 se ejecuta solo si ExecStart tuvo éxito.

PHP / Laravel scheduler

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

Laravel tiene un método thenPing() integrado precisamente para este propósito.

Avanzado: ping al inicio y al final

Para una detección más detallada puede enviar también un ping de "start" (la tarea ha comenzado): así distinguirá "la tarea no empezó" de "la tarea se ha quedado atascada":

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

# Su tarea
/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 - simulación de una sola ejecución

Antes de incluirlo en cron pruebe la URL a mano:

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

Tras la llamada exitosa, en el panel de ePulz.io verá el estado del monitor pasar de Pending a OK.