Додавання до cron job

4 хв читання · Heartbeat (cron моніторинг)

Мета: Додати heartbeat URL до існуючого cron job або скрипту, щоб ePulz.io отримував "я живий" ping після кожного успішного запуску.

Принцип

Heartbeat URL викликаєте після успішного завершення завдання. Якщо скрипт не вдасться, URL не буде викликана, ePulz.io помітить відсутній ping і надішле вам сповіщення.

Bash / shell cron

Додайте виклик curl у кінець свого cron рядка, з'єднаний оператором &&:

# /etc/crontab або crontab -e
0 3 * * * /usr/local/bin/backup.sh && curl -fsS -m 10 \
  https://epulz.io/heartbeat/Qs78OPNIIsCF_-Vj > /dev/null

Прапорці curl:

  • -f = fail на non-2xx response (curl поверне error)
  • -s = silent (не пише progress)
  • -S = але покаже errors (комбінація з -s)
  • -m 10 = max-time 10 секунд (timeout)
  • > /dev/null = response не заповнює cron log

Python

Для Python скриптів додайте виклик через requests або urllib:

import os
import requests

HEARTBEAT_URL = os.environ.get("HEARTBEAT_URL")

def sync_data():
    # ... ваша логіка ...
    pass

try:
    sync_data()
    # Heartbeat надсилається лише якщо sync_data() не raise exception
    if HEARTBEAT_URL:
        requests.get(HEARTBEAT_URL, timeout=10)
except Exception as e:
    # Heartbeat не надсилається - ePulz.io вас сповістить
    print(f"Sync failed: {e}")
    raise

Без зовнішньої бібліотеки, лише зі стандартною:

import urllib.request

# Після успішного завершення завдання
urllib.request.urlopen("https://epulz.io/heartbeat/Qs78OPNIIsCF_-Vj", timeout=10)

Node.js

const HEARTBEAT_URL = process.env.HEARTBEAT_URL;

async function nightlyJob() {
  await processInvoices();
  // Heartbeat лише після успішного завершення
  await fetch(HEARTBEAT_URL, { signal: AbortSignal.timeout(10000) });
}

nightlyJob().catch(err => {
  console.error(err);
  process.exit(1);  // Heartbeat не надсилається, ePulz.io вас сповістить
});

Docker / systemd timer

Для systemd timer, додайте ExecStartPost до .service файлу:

# /etc/systemd/system/db-backup.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
ExecStartPost=/usr/bin/curl -fsS -m 10 https://epulz.io/heartbeat/Qs78OPNIIsCF_-Vj

ExecStartPost запускається лише якщо ExecStart був успішним.

PHP / Laravel scheduler

// app/Console/Kernel.php
$schedule->command('backup:run')
    ->daily()
    ->thenPing('https://epulz.io/heartbeat/Qs78OPNIIsCF_-Vj');

Laravel має вбудований метод thenPing() саме для цієї мети.

Розширено: ping на початку і в кінці

Для більш ретельного виявлення можете надсилати і "start" ping (завдання запустилося) - розрізните "завдання взагалі не почалося" від "завдання зависло":

# Start ping
curl -fsS -m 10 https://epulz.io/heartbeat/Qs78OPNIIsCF_-Vj/start > /dev/null

# Ваше завдання
/usr/local/bin/backup.sh
EXIT_CODE=$?

# Done ping з exit code
curl -fsS -m 10 "https://epulz.io/heartbeat/Qs78OPNIIsCF_-Vj?exit=$EXIT_CODE" > /dev/null

Тест - симуляція одного запуску

Перед додаванням до cron протестуйте URL вручну:

$ curl -fsS https://epulz.io/heartbeat/Qs78OPNIIsCF_-Vj
OK

Після успішного виклику в дашборді ePulz.io побачите, як стан монітора перейде з Pending на OK.