Cron-Ping

Alerte quand votre sauvegarde ne tourne plus — avant d'en avoir besoin

Dernière mise à jour : juillet 2026 · Par Yohann Kipfer, Cron-Ping

En résumé

La panne de sauvegarde dangereuse, ce n'est pas « le dump a échoué ». C'est « le dump n'a même jamais démarré — pendant des semaines — et personne ne le savait ». Un disque plein, une clé SSH expirée, une crontab effacée par une reconstruction de serveur : la sauvegarde s'arrête en silence, et vous le découvrez le jour où vous tentez de restaurer. Ajoutez un ping qui ne part que si la sauvegarde réussit, et laissez son absence vous alerter :

0 2 * * * /opt/backup.sh && curl -fsS https://cron-ping.com/p/TOKEN

Le && est toute l'astuce : curl ne s'exécute que si backup.sh sort en 0. Si le script échoue ou ne tourne jamais, aucun ping n'atteint Cron-Ping, et une fois le délai de grâce passé vous recevez un mail. Une sauvegarde non surveillée n'est pas une sauvegarde — c'est un espoir.

Le scénario cauchemar, c'est le silence, pas l'erreur

La plupart des équipes qui perdent des données n'avaient pas « aucune sauvegarde ». Elles avaient des sauvegardes cassées en silence depuis des mois. La chaîne classique : le disque de destination se remplit, ou la clé SSH vers l'offsite expire, ou une reconstruction de serveur fait sauter la ligne de crontab — et le job de nuit soit part en erreur dans /dev/null, soit ne se déclenche jamais. Tout paraît normal. Les dashboards sont verts. Puis un disque meurt, on lance la restauration, et la copie exploitable la plus récente date d'avant le début du problème.

C'est arrivé à grande échelle. En janvier 2017, GitLab a perdu ~6 heures de données de production lors d'un incident où, dans leur propre post-mortem, cinq méthodes de sauvegarde et de réplication distinctes se révélaient défaillantes ou ne fonctionnant pas comme prévu — en silence. Ils n'ont récupéré que grâce à un snapshot manuel qu'un ingénieur avait pris par chance. La leçon écrite noir sur blanc : une sauvegarde non testée et non surveillée est indiscernable d'une absence de sauvegarde.

Un moniteur ne fait pas les sauvegardes ; il rend leur absence bruyante. C'est la moitié manquante de tout script de backup.

Pinguer au succès — une ligne par outil

Chaînez le ping avec && pour qu'il ne parte que sur une sortie propre (code 0). Voici le motif pour les outils courants :

Ajouter un ping de succès aux commandes de sauvegarde courantes
OutilLigne
mysqldumpmysqldump --single-transaction db | gzip > d.sql.gz && curl -fsS …/p/TOKEN
pg_dumppg_dump -Fc db > d.dump && curl -fsS …/p/TOKEN
rsyncrsync -a /data/ backup:/srv/ && curl -fsS …/p/TOKEN
borgborg create ::'{now}' /data && curl -fsS …/p/TOKEN
resticrestic backup /data && curl -fsS …/p/TOKEN

curl -fsS est volontaire : -f échoue sur une erreur HTTP, -s reste silencieux, -S affiche quand même une erreur en cas de souci — le curl lui-même ne peut donc pas échouer en douce. Donnez au check Cron-Ping la même période que la sauvegarde (quotidienne → 1 jour, hebdo → 7 jours) et une grâce assez large pour couvrir une nuit lente sans masquer une exécution vraiment manquée.

Un code de sortie propre n'est pas une bonne sauvegarde — vérifiez la taille

mysqldump peut sortir en 0 et vous rendre un dump cassé. Deux pièges réels : avec --force, il continue après une erreur de table et sort quand même en 0 ; et un dump interrompu par une connexion qui tombe peut laisser un fichier tronqué avec un code 0 si le buffering le cache. La parade : vérifier l'artefact, pas seulement le code de sortie — et envoyer /fail quand il est vide :

#!/bin/bash
set -o pipefail
OUT=/backup/db-$(date +%F).sql.gz
mysqldump --single-transaction --quick app | gzip > "$OUT"

# une vraie sauvegarde ne fait jamais quelques octets — 0 ou minuscule = échec
if [ -s "$OUT" ] && [ "$(stat -c%s "$OUT")" -gt 1024 ]; then
  curl -fsS https://cron-ping.com/p/TOKEN
else
  curl -fsS https://cron-ping.com/p/TOKEN/fail
fi

set -o pipefail compte ici : sans lui, mysqldump | gzip renvoie le code de gzip, donc un dump échoué envoyé dans un gzip réussi ressemble à un succès. Avec pipefail, le pipeline échoue si n'importe quelle étape échoue.

Mesurez l'exécution, et lisez les codes de sortie de l'outil

Pinguez /start en tête et /success à la fin, et Cron-Ping enregistre la *durée*. Un pg_dump de nuit passé de 4 à 40 minutes vous dit que la base a grossi — utile bien avant que ça devienne un job planté à 3 h du matin. Et borg comme restic ont des codes de sortie plus riches que 0/1, sur lesquels il vaut la peine de brancher :

Codes de sortie borg et restic sur lesquels agir
Codeborgrestic
0succèssuccès
1avertissement (terminé avec des warnings)erreur générale — sauvegarde échouée
2erreur — sauvegarde échouéeerreur runtime Go
3certains fichiers source illisibles (sauvegarde partielle)

Un borg en 1 (warning) ou un restic en 3 (partiel), c'est exactement l'état « a tourné, mais pas vraiment » qu'un simple && compterait comme succès. Branchez sur le code et envoyez /fail pour qu'une sauvegarde partielle ne se fasse pas passer pour une bonne.

Le reste de l'assurance : 3-2-1, chiffrement, et tester la restauration

FAQ

Comment être alerté si ma sauvegarde ne tourne plus ?

Ajoutez && curl -fsS https://cron-ping.com/p/TOKEN à la fin de la commande de sauvegarde et créez un check dont la période correspond à l'horaire. Le ping ne part que sur une sauvegarde réussie ; si elle échoue ou ne tourne jamais, aucun ping n'arrive, et une fois le délai de grâce écoulé Cron-Ping vous alerte par e-mail ou Slack. Ça couvre le cas que les outils internes ne voient pas : un job qui n'a jamais démarré.

Mon script sort en 0 mais le dump est vide — comment l'attraper ?

Vérifiez l'artefact, pas seulement le code de sortie. Testez la taille du fichier ([ -s fichier ] et un minimum d'octets) avant de pinguer le succès, et tapez l'endpoint /fail s'il est trop petit. Utilisez aussi set -o pipefail pour qu'un mysqldump | gzip échoué ne fasse pas passer le succès de gzip pour celui de tout le pipeline.

Quelle période et quelle grâce pour une sauvegarde de nuit ?

Période = 1 jour pour un job quotidien, 7 jours pour un hebdomadaire. La grâce doit couvrir la durée d'une exécution normale plus un peu de marge — si le dump prend d'habitude 20 minutes, une grâce d'1 à 2 heures absorbe une nuit lente sans masquer une exécution qui n'a vraiment pas eu lieu. Pour une sauvegarde hebdo, une grâce de plusieurs heures à un jour est raisonnable.

Ça marche avec restic et borg ?

Oui. Chaînez le ping après restic backup ou borg create. Mieux : branchez sur leurs codes de sortie. Un borg en 1 (warning) ou un restic en 3 (certains fichiers illisibles) est une sauvegarde partielle qu'il faut traiter comme un échec et envoyer sur /fail, pas compter comme verte.

Un log de sauvegarde vert ne suffit-il pas ?

Non — un log n'existe que si le job a tourné, et encore faut-il le lire. Les pannes qui coûtent des données sont celles où le job s'est arrêté en silence : crontab effacée, disque plein, clé expirée. Il n'y a aucun log d'erreur pour un job qui ne s'est jamais déclenché. Un heartbeat manquant est le seul signal qui vous atteint sans que vous ayez à regarder.

Recevez un mail le jour où votre sauvegarde s'arrête — pas le jour où vous en avez besoin

Ajoutez un && curl à votre script de sauvegarde et réglez un check sur son horaire. Si le dump échoue, sort vide, ou ne démarre jamais, le ping n'arrive pas et Cron-Ping vous alerte — pendant qu'il reste encore une bonne copie sur laquelle se rabattre.

Créer un check gratuit

Plan gratuit : 10 checks, alertes email, historique 7 jours. Sans carte. Hébergé en UE.

À lire ensuite

Surveiller un cron Linux qui ne tourne plusLa couche OS sous votre cron de sauvegarde : crond, /var/mail, une crontab écrasée.Surveiller le scheduler LaravelSi votre backup tourne en tâche planifiée Laravel, surveillez aussi le scheduler.Surveiller les crons SupabaseUne sauvegarde lancée depuis pg_cron ? Pinguez avec pg_net de la même façon.Validateur d'expression cronVérifiez que l'horaire de votre ligne de backup se déclenche bien quand vous le croyez.

Sources