Aide et guidesHeartbeat (cron monitoring) › Ajout au cron job (bash, Python, Node)

Ajout au cron job (bash, Python, Node)

4 min de lecture · Heartbeat (cron monitoring)

Objectif : ajouter une URL heartbeat à un cron job ou script existant, pour qu'ePulz.io reçoive un ping "je suis vivant" après chaque exécution réussie.

Principe

Vous appelez l'URL heartbeat après la réussite de la tâche. Si le script échoue, l'URL n'est pas appelée, ePulz.io remarque le ping manquant et vous envoie une alerte.

Bash / shell cron

Ajoutez l'appel curl à la fin de votre ligne cron, relié par l'opérateur && :

# /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 curl :

  • -f = fail sur une réponse non-2xx (curl retourne une erreur)
  • -s = silent (n'écrit pas la progression)
  • -S = mais affiche les erreurs (combinaison avec -s)
  • -m 10 = max-time 10 secondes (timeout)
  • > /dev/null = la réponse n'encombre pas le log cron

Python

Pour les scripts Python, ajoutez l'appel via requests ou urllib :

import os
import requests

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

def sync_data():
    # ... votre logique ...
    pass

try:
    sync_data()
    # Le heartbeat n'est envoyé que si sync_data() ne lève pas d'exception
    if HEARTBEAT_URL:
        requests.get(HEARTBEAT_URL, timeout=10)
except Exception as e:
    # Le heartbeat n'est pas envoyé - ePulz.io vous avertit
    print(f"Sync failed: {e}")
    raise

Sans bibliothèque externe, uniquement avec la standard :

import urllib.request

# Après la réussite de la tâche
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 seulement après la réussite
  await fetch(HEARTBEAT_URL, { signal: AbortSignal.timeout(10000) });
}

nightlyJob().catch(err => {
  console.error(err);
  process.exit(1);  // Le heartbeat n'est pas envoyé, ePulz.io vous avertit
});

Docker / systemd timer

Pour un timer systemd, ajoutez ExecStartPost au fichier .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 ne s'exécute que si ExecStart a réussi.

PHP / Laravel scheduler

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

Laravel a une méthode intégrée thenPing() précisément pour cet usage.

Avancé : ping au début et à la fin

Pour une détection plus approfondie, vous pouvez aussi envoyer un ping "start" (la tâche a démarré) - vous distinguez ainsi "la tâche n'a pas du tout commencé" de "la tâche s'est bloquée" :

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

# Votre tâche
/usr/local/bin/backup.sh
EXIT_CODE=$?

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

Test - simulation d'une exécution

Avant d'ajouter au cron, testez l'URL manuellement :

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

Après un appel réussi, dans le tableau de bord ePulz.io, vous verrez l'état du moniteur passer de Pending à OK.