Ping desde cualquier lenguaje

Fragmentos de código listos para usar que hacen ping a una URL de heartbeat de SteadyCron en éxito y fallo — Bash, Python, Node.js, PHP, Ruby, Go, PowerShell, Docker y systemd.

Un heartbeat check es simplemente una URL a la que llamas cuando tu job se ejecuta. Copia un fragmento de abajo, reemplaza <your-ping-token> y ya estás monitorizado. En caso de éxito, haz ping a la URL base; en caso de fallo, haz ping a /fail; opcionalmente haz ping a /start primero para detectar ejecuciones bloqueadas.

Tu ping URL tiene el aspecto https://ping.steadycron.com/<your-ping-token> — encuéntrala en la página del check después de crear un heartbeat.

curl (una sola línea)

curl -fsS -m 10 --retry 3 https://ping.steadycron.com/<your-ping-token>

-f falla en errores HTTP, -s es silencioso, -m 10 limita el tiempo, --retry 3 sobrevive a un breve corte de red.

Bash (start / success / fail)

#!/usr/bin/env bash
set -euo pipefail
TOKEN=<your-ping-token>
PING="https://ping.steadycron.com/$TOKEN"

curl -fsS -m 10 "$PING/start"            # job started

if ./run-job.sh; then
  curl -fsS -m 10 "$PING"                # success
else
  curl -fsS -m 10 "$PING/fail"           # explicit failure
fi

Envolver cualquier comando

Haz ping a /fail automáticamente si el comando sale con código distinto de cero — sin modificar el job en sí:

TOKEN=<your-ping-token>
PING="https://ping.steadycron.com/$TOKEN"
./run-job.sh && curl -fsS "$PING" || curl -fsS "$PING/fail"

Python

import subprocess
import urllib.request

TOKEN = "<your-ping-token>"
PING = f"https://ping.steadycron.com/{TOKEN}"

def ping(suffix=""):
    try:
        urllib.request.urlopen(PING + suffix, timeout=10)
    except Exception:
        pass  # never let monitoring break the job

ping("/start")
try:
    subprocess.run(["./run-job.sh"], check=True)
    ping()           # success
except subprocess.CalledProcessError:
    ping("/fail")    # failure

Node.js

const TOKEN = "<your-ping-token>";
const PING = `https://ping.steadycron.com/${TOKEN}`;

const ping = (suffix = "") =>
  fetch(PING + suffix, { signal: AbortSignal.timeout(10_000) }).catch(() => {});

await ping("/start");
try {
  await runJob();
  await ping();          // success
} catch {
  await ping("/fail");   // failure
}

PHP

<?php
$token = "<your-ping-token>";
$ping  = "https://ping.steadycron.com/$token";

function ping(string $url): void {
    @file_get_contents($url, false, stream_context_create([
        "http" => ["timeout" => 10, "ignore_errors" => true],
    ]));
}

ping("$ping/start");
$exit = 0;
system("./run-job.sh", $exit);
ping($exit === 0 ? $ping : "$ping/fail");

Ruby

require "net/http"

token = "<your-ping-token>"
ping  = "https://ping.steadycron.com/#{token}"

def hit(url) = Net::HTTP.get_response(URI(url)) rescue nil

hit("#{ping}/start")
if system("./run-job.sh")
  hit(ping)          # success
else
  hit("#{ping}/fail")
end

Go

package main

import (
	"net/http"
	"os/exec"
	"time"
)

const ping = "https://ping.steadycron.com/<your-ping-token>"

func hit(suffix string) {
	c := &http.Client{Timeout: 10 * time.Second}
	if resp, err := c.Get(ping + suffix); err == nil {
		resp.Body.Close()
	}
}

func main() {
	hit("/start")
	if err := exec.Command("./run-job.sh").Run(); err == nil {
		hit("") // success
	} else {
		hit("/fail")
	}
}

PowerShell (Windows / Tareas programadas)

$token = "<your-ping-token>"
$ping  = "https://ping.steadycron.com/$token"

function Ping($url) { try { Invoke-WebRequest -UseBasicParsing -TimeoutSec 10 $url | Out-Null } catch {} }

Ping "$ping/start"
& ".\run-job.ps1"
if ($LASTEXITCODE -eq 0) { Ping $ping } else { Ping "$ping/fail" }

Docker healthcheck

HEALTHCHECK --interval=5m --timeout=10s \
  CMD curl -fsS https://ping.steadycron.com/<your-ping-token> || exit 1

systemd timer

Añade un ExecStartPost / ExecStopPost al servicio que lanza tu timer:

[Service]
Type=oneshot
ExecStart=/usr/local/bin/run-job.sh
ExecStartPost=/usr/bin/curl -fsS https://ping.steadycron.com/<your-ping-token>

Próximos pasos

  • Heartbeat monitoring — periodos de gracia y detección de ejecuciones bloqueadas.
  • Alertas — recibe notificaciones cuando se pierde un ping.