Cada monitor de cron job tiene su propia URL de ping, que aparece en su página. Sustituye https://app.uptimecheck.com/api/hb/your-token en los ejemplos por la tuya. Para crear el monitor, consulta cómo monitorizar un cron job.
Las URL
…/your-token: el job se ejecutó y terminó bien.…/your-token/start: el job ha empezado. Verás los tiempos de ejecución, y una ejecución que supere el Maximum run time genera una alerta.…/your-token/fail: el job ha fallado. Recibes la alerta al momento en lugar de al llegar el plazo.…/your-token/0 a /255: el código de salida. 0 es éxito; cualquier otro, un fallo.
Funcionan GET, POST y HEAD, y la respuesta es OK. El cuerpo de un POST se guarda como la salida del job y se muestra con los fallos y en la alerta. Leemos hasta 64 kB y guardamos el principio y el final, 10.000 caracteres en total. Un cuerpo más grande se rechaza y el ping se pierde, así que envía el final del log, como en los ejemplos. El token de la URL es el secreto, así que no lo dejes en logs públicos.
Un wrapper para cualquier programador de tareas
Este script ejecuta un comando, informa de su inicio, su código de salida y los últimos 60 kB de salida, y devuelve el mismo código de salida. Guárdalo como /usr/local/bin/with-ping y ejecuta chmod +x sobre él.
#!/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
Configura el monitor con la misma programación y la Time zone en la que se ejecuta el crontab, a menudo UTC.
Programador de tareas de Laravel
Laravel hace los pings a las URL por sí mismo. En routes/console.php (Laravel 11 y posteriores; en versiones anteriores, los mismos métodos sobre $schedule en 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»);
Un fallo es un comando que termina con un código de salida distinto de cero. La programación sigue la zona horaria de la aplicación salvo que añadas ->timezone(); configura la misma en el monitor.
Kubernetes CronJob
Guarda la URL de ping como secret con kubectl create secret generic uptimecheck –from-literal=ping-url=https://app.uptimecheck.com/api/hb/your-token. La imagen necesita curl.
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
Si el pod no llega a arrancar, por ejemplo porque no se puede descargar la imagen, no llega ningún ping y el monitor alerta al cumplirse el plazo. timeZone requiere Kubernetes 1.27 o posterior.
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»
Guarda la URL de ping como el secret del repositorio UPTIMECHECK_PING_URL. Configura el monitor con la zona horaria del workflow, UTC por defecto. GitHub puede iniciar con retraso las ejecuciones programadas cuando está saturado, así que deja un Grace period generoso, por ejemplo de 30 minutos.
Timer de systemd
# /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
Actívalo con sudo systemctl daemon-reload y sudo systemctl enable –now backup.timer. OnCalendar sigue la zona horaria del servidor.
Programador de tareas de Windows
# 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
Regístralo para que se ejecute cada noche a las 03:00, en PowerShell como administrador:
$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
El Programador de tareas usa la zona horaria del equipo; configura la misma en el monitor. Lee más sobre expresiones cron y la monitorización de cron jobs.