Добавление в 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.

Было ли это руководство полезным?