Elke cronjob-monitor heeft een eigen ping-URL, die op de pagina van de monitor staat. Vervang https://app.uptimecheck.com/api/hb/your-token hieronder door die van jou. Hoe je de monitor aanmaakt, lees je in een cronjob monitoren.
De URL’s
…/your-token: de job is gedraaid en geslaagd.…/your-token/start: de job is gestart. Je ziet de looptijden, en een run die langer duurt dan de Maximum run time geeft een melding.…/your-token/fail: de job is mislukt. Je krijgt meteen een melding in plaats van pas bij de deadline.…/your-token/0 tot /255: de exitcode. 0 betekent geslaagd, al het andere is een fout.
GET, POST en HEAD werken allemaal, en het antwoord is OK. Een POST-body wordt bewaard als de output van de job en getoond bij fouten en in de melding. We lezen maximaal 64 kB en bewaren het begin en het einde, samen 10.000 tekens. Een grotere body wordt geweigerd en de ping gaat verloren, dus stuur het einde van de log mee, zoals hieronder. Het token in de URL is het geheim, dus houd het uit openbare logs.
Een wrapper voor elke scheduler
Dit script voert een commando uit, meldt de start, de exitcode en de laatste 60 kB aan output, en geeft de exitcode door. Sla het op als /usr/local/bin/with-ping en voer er chmod +x op uit.
#!/bin/sh
# with-ping URL COMMAND…: runs COMMAND and reports it to Uptimecheck
url=”$1″; shift
curl -fsS -m 10 –retry 3 -o /dev/null “$url/start”
log=$(mktemp)
“$@” > “$log” 2>&1
code=$?
tail -c 60000 “$log” | curl -fsS -m 10 –retry 3 –data-binary @- -o /dev/null “$url/$code”
rm -f “$log”
exit $code
crontab
# Ping when the job succeeds
0 3 * * * /usr/local/bin/backup.sh && curl -fsS -m 10 –retry 3 -o /dev/null https://app.uptimecheck.com/api/hb/your-token
# Or report start, exit code and output with the script above
0 3 * * * /usr/local/bin/with-ping https://app.uptimecheck.com/api/hb/your-token /usr/local/bin/backup.sh
Geef de monitor hetzelfde schema en de Time zone waarin de crontab draait, vaak UTC.
Laravel scheduler
Laravel pingt zelf URL’s. In routes/console.php (Laravel 11 en later; daarvoor dezelfde methodes op $schedule in app/Console/Kernel.php):
use Illuminate\Support\Facades\Schedule;
Schedule::command(“backup:run”)
->dailyAt(“03:00”)
->pingBefore(“https://app.uptimecheck.com/api/hb/your-token/start”)
->pingOnSuccess(“https://app.uptimecheck.com/api/hb/your-token”)
->pingOnFailure(“https://app.uptimecheck.com/api/hb/your-token/fail”);
Een fout is een commando dat eindigt met een exitcode die niet nul is. Het schema volgt de tijdzone van de app, tenzij je ->timezone() toevoegt; stel op de monitor dezelfde in.
Kubernetes CronJob
Sla de ping-URL op als secret met kubectl create secret generic uptimecheck –from-literal=ping-url=https://app.uptimecheck.com/api/hb/your-token. De image heeft curl nodig.
apiVersion: batch/v1
kind: CronJob
metadata:
name: nightly-backup
spec:
schedule: “0 3 * * *”
timeZone: “Europe/Stockholm”
concurrencyPolicy: Forbid
jobTemplate:
spec:
backoffLimit: 0
template:
spec:
restartPolicy: Never
containers:
– name: backup
image: registry.example.com/backup:1.4
env:
– name: PING_URL
valueFrom:
secretKeyRef:
name: uptimecheck
key: ping-url
command: [“/bin/sh”, “-c”]
args:
– |
curl -fsS -m 10 –retry 3 -o /dev/null “$PING_URL/start”
/app/backup.sh > /tmp/out.log 2>&1
code=$?
tail -c 60000 /tmp/out.log | curl -fsS -m 10 –retry 3 –data-binary @- -o /dev/null “$PING_URL/$code”
exit $code
Start de pod nooit, bijvoorbeeld omdat de image niet kan worden opgehaald, dan komt er geen ping binnen en geeft de monitor een melding bij de deadline. timeZone vereist Kubernetes 1.27 of later.
GitHub Actions
on:
schedule:
– cron: “0 3 * * *”
jobs:
nightly:
runs-on: ubuntu-latest
env:
PING_URL: ${{ secrets.UPTIMECHECK_PING_URL }}
steps:
– uses: actions/checkout@v4
– run: curl -fsS -m 10 –retry 3 -o /dev/null “$PING_URL/start” || true
– run: ./scripts/nightly.sh
– if: success()
run: curl -fsS -m 10 –retry 3 -o /dev/null “$PING_URL”
– if: failure()
run: curl -fsS -m 10 –retry 3 -o /dev/null “$PING_URL/fail”
Sla de ping-URL op als repository secret UPTIMECHECK_PING_URL. Geef de monitor de tijdzone van de workflow, standaard UTC. GitHub kan geplande runs later starten als het druk is, dus kies een ruime Grace period, zoals 30 minuten.
systemd timer
# /etc/systemd/system/backup.service
[Unit]
Description=Nightly backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/with-ping https://app.uptimecheck.com/api/hb/your-token /usr/local/bin/backup.sh
# /etc/systemd/system/backup.timer
[Unit]
Description=Run the nightly backup
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
Zet hem aan met sudo systemctl daemon-reload en sudo systemctl enable –now backup.timer. OnCalendar volgt de tijdzone van de server.
Windows Taakplanner (Task Scheduler)
# C:\Scripts\backup-with-ping.ps1
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$ping = “https://app.uptimecheck.com/api/hb/your-token”
try { Invoke-RestMethod -Uri “$ping/start” -TimeoutSec 10 | Out-Null } catch {}
$output = & “C:\Scripts\backup.cmd” 2>&1 | Out-String
$code = $LASTEXITCODE
if ($output.Length -gt 30000) { $output = $output.Substring($output.Length – 30000) }
Invoke-RestMethod -Uri “$ping/$code” -Method Post -Body $output -TimeoutSec 10 | Out-Null
exit $code
Registreer het script om elke nacht om 03:00 te draaien, in PowerShell als Administrator:
$action = New-ScheduledTaskAction -Execute “powershell.exe” -Argument “-NoProfile -ExecutionPolicy Bypass -File C:\Scripts\backup-with-ping.ps1”
$trigger = New-ScheduledTaskTrigger -Daily -At 3am
Register-ScheduledTask -TaskName “Nightly backup” -Action $action -Trigger $trigger -User “SYSTEM” -RunLevel Highest
Taakplanner gebruikt de tijdzone van de computer; stel op de monitor dezelfde in. Lees meer over cron-expressies en cronjob-monitoring.