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

После успешного вызова в dashboard ePulz.io вы увидите, как состояние монитора переходит из Pending на OK.