Aus jeder Sprache pingen

Copy-Paste-Snippets, um eine SteadyCron-Heartbeat-URL bei Erfolg und Fehler anzupingen — Bash, Python, Node.js, PHP, Ruby, Go, PowerShell, Docker und systemd.

Ein Heartbeat-Check ist einfach eine URL, die Sie anfragen, wenn Ihr Job läuft. Kopieren Sie ein Snippet unten, ersetzen Sie <ihr-ping-token>, und Sie sind überwacht. Bei Erfolg pingen Sie die Basis-URL an; bei Fehler /fail; optional zuerst /start, damit hängende Läufe erkannt werden.

Ihre Ping-URL sieht aus wie https://ping.steadycron.com/<ihr-ping-token> — Sie finden sie auf der Seite des Checks, nachdem Sie einen Heartbeat angelegt haben.

curl (Einzeiler)

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

-f schlägt bei HTTP-Fehlern fehl, -s ist still, -m 10 begrenzt die Zeit, --retry 3 übersteht einen kurzen Netzwerk-Aussetzer.

Bash (start / success / fail)

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

curl -fsS -m 10 "$PING/start"            # Job gestartet

if ./run-job.sh; then
  curl -fsS -m 10 "$PING"                # Erfolg
else
  curl -fsS -m 10 "$PING/fail"           # expliziter Fehler
fi

Beliebigen Befehl umschließen

Pingt automatisch /fail, wenn der Befehl mit einem Code ungleich null endet — ohne Änderungen am Job selbst:

TOKEN=<ihr-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 = "<ihr-ping-token>"
PING = f"https://ping.steadycron.com/{TOKEN}"

def ping(suffix=""):
    try:
        urllib.request.urlopen(PING + suffix, timeout=10)
    except Exception:
        pass  # Monitoring darf den Job nie kaputtmachen

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

Node.js

const TOKEN = "<ihr-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();          // Erfolg
} catch {
  await ping("/fail");   // Fehler
}

PHP

<?php
$token = "<ihr-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 = "<ihr-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)          # Erfolg
else
  hit("#{ping}/fail")
end

Go

package main

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

const ping = "https://ping.steadycron.com/<ihr-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("") // Erfolg
	} else {
		hit("/fail")
	}
}

PowerShell (Windows / Aufgabenplanung)

$token = "<ihr-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/<ihr-ping-token> || exit 1

systemd-Timer

Fügen Sie der Service-Unit, die Ihr Timer ausführt, ein ExecStartPost / ExecStopPost hinzu:

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

Nächste Schritte