Monitoring de cron : exemples crontab, Docker
Partout, le principe est le même : faire une requête HTTP sur l’URL de ping quand le job réussit (et, mieux, sur /start au début et sur /fail en cas d’échec). Remplacez <clé-de-ping> par la clé de votre check. Les options -fsS -m 10 --retry 3 sont expliquées dans l’API de ping.
Le plus simple : le ping part uniquement si le script réussit (&&).
0 2 * * * /usr/local/bin/backup.sh && curl -fsS -m 10 --retry 3 https://app.silencewatch.com/p/<clé-de-ping>Pour mesurer la durée et signaler l’échec explicitement, passez par un petit script :
#!/bin/shURL=https://app.silencewatch.com/p/<clé-de-ping>curl -fsS -m 10 --retry 3 "$URL/start"/usr/local/bin/backup.shcurl -fsS -m 10 --retry 3 "$URL/$?"Dans le service lancé par le minuteur (timer) :
[Service]Type=oneshotExecStart=/bin/sh -c '/usr/local/bin/backup.sh && curl -fsS -m 10 --retry 3 https://app.silencewatch.com/p/<clé-de-ping>'[Timer]OnCalendar=*-*-* 02:00:00Persistent=true
[Install]WantedBy=timers.targetdocker run --rm mon-image /app/job.sh \ && curl -fsS -m 10 --retry 3 https://app.silencewatch.com/p/<clé-de-ping>Dans un docker-compose.yml, vous pouvez enchaîner dans la commande du service : command: sh -c "/app/job.sh && curl -fsS -m 10 --retry 3 $PING_URL", à condition que l’image contienne curl.
apiVersion: batch/v1kind: CronJobmetadata: name: backupspec: schedule: "0 2 * * *" jobTemplate: spec: template: spec: restartPolicy: OnFailure containers: - name: backup image: mon-image:latest command: ["/bin/sh", "-c"] args: - /app/backup.sh && curl -fsS -m 10 --retry 3 "$PING_URL" env: - name: PING_URL valueFrom: secretKeyRef: name: silencewatch key: ping-urlL’URL de ping est un secret : placez-la dans un Secret, pas dans le manifeste.
on: schedule: - cron: "0 2 * * *"jobs: nightly: runs-on: ubuntu-latest steps: - run: ./scripts/nightly.sh - name: Ping SilenceWatch if: success() run: curl -fsS -m 10 --retry 3 "${{ secrets.SILENCEWATCH_PING_URL }}" - name: Signaler l’échec if: failure() run: curl -fsS -m 10 --retry 3 "${{ secrets.SILENCEWATCH_PING_URL }}/fail"Les workflows planifiés de GitHub peuvent être retardés ou sautés ; c’est précisément le genre d’absence qu’un dead man’s switch détecte.
import requests
URL = "https://app.silencewatch.com/p/<clé-de-ping>"
requests.get(f"{URL}/start", timeout=10)try: run_job()except Exception: requests.get(f"{URL}/fail", timeout=10) raiseelse: requests.get(URL, timeout=10)const URL_PING = 'https://app.silencewatch.com/p/<clé-de-ping>';
await fetch(`${URL_PING}/start`, { signal: AbortSignal.timeout(10_000) });try { await runJob(); await fetch(URL_PING, { signal: AbortSignal.timeout(10_000) });} catch (error) { await fetch(`${URL_PING}/fail`, { signal: AbortSignal.timeout(10_000) }); throw error;}$url = "https://app.silencewatch.com/p/<clé-de-ping>"& "C:\Jobs\backup.ps1"if ($?) { Invoke-RestMethod -Uri $url -TimeoutSec 10 }else { Invoke-RestMethod -Uri "$url/fail" -TimeoutSec 10 }Pour Spring Boot
Section intitulée « Pour Spring Boot »N’écrivez rien : le starter Spring Boot découvre les @Scheduled et les jobs Quartz et envoie les pings à votre place.