Ajuda e guiasHeartbeat (cron monitoring) › Adicionar ao cron job

Adicionar ao cron job

4 min de leitura · Heartbeat (cron monitoring)

Objetivo: Adicionar a heartbeat URL a um cron job ou script existente para que o ePulz.io receba o ping "estou vivo" após cada execução bem-sucedida.

Princípio

Você chama a heartbeat URL após a conclusão bem-sucedida da tarefa. Se o script falhar, a URL não é chamada, o ePulz.io percebe a falta do ping e envia um alerta.

Bash / shell cron

Adicione a chamada curl ao fim da linha do cron com o operador &&:

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

Flags do curl:

  • -f = fail em resposta non-2xx (curl retorna error)
  • -s = silent (não escreve progress)
  • -S = mas mostra errors (combinação com -s)
  • -m 10 = max-time 10 segundos (timeout)
  • > /dev/null = a resposta não polui o cron log

Python

Para scripts Python adicione a chamada via requests ou urllib:

import os
import requests

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

def sync_data():
    # ... a sua lógica ...
    pass

try:
    sync_data()
    # O heartbeat é enviado apenas se sync_data() não levantar exception
    if HEARTBEAT_URL:
        requests.get(HEARTBEAT_URL, timeout=10)
except Exception as e:
    # O heartbeat não é enviado - o ePulz.io vai avisar você
    print(f"Sync failed: {e}")
    raise

Sem biblioteca externa, apenas com a standard:

import urllib.request

# Após a conclusão bem-sucedida da tarefa
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 apenas após conclusão bem-sucedida
  await fetch(HEARTBEAT_URL, { signal: AbortSignal.timeout(10000) });
}

nightlyJob().catch(err => {
  console.error(err);
  process.exit(1);  // O heartbeat não é enviado, o ePulz.io vai avisar você
});

Docker / systemd timer

Para systemd timer, adicione ExecStartPost ao arquivo .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 roda apenas se ExecStart tiver sucesso.

PHP / Laravel scheduler

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

O Laravel tem o método thenPing() incorporado exatamente para este fim.

Avançado: ping no início e no fim

Para detecção mais rigorosa você pode enviar também o ping "start" (a tarefa foi iniciada) - assim você distingue "a tarefa nem começou" de "a tarefa travou":

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

# A sua tarefa
/usr/local/bin/backup.sh
EXIT_CODE=$?

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

Test - simulação de uma execução

Antes de colocar no cron, teste a URL manualmente:

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

Após a chamada bem-sucedida, no dashboard do ePulz.io você verá o estado do monitor passar de Pending para OK.