Añadir al cron job (bash, Python, Node)
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.