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

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

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

Принцип роботи

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

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 = завершитися з помилкою за відповіді про помилку (curl повертає помилку)
  • -s = тихо (не виводить хід виконання)
  • -S = але показує помилки (у поєднанні з -s)
  • -m 10 = обмеження за часом 10 секунд
  • > /dev/null = відповідь не переповнює журнал cron

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() не завершилася з помилкою
    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

За використання таймера systemd додайте до файлу .service рядок ExecStartPost:

# /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

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

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

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

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

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

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

Чи був цей посібник корисним?