Cron-задания только со скриптами (без агента)
Иногда вы уже точно знаете, какое сообщение хотите отправить. Нет нужды в агенте, который будет размышлять над ним — вам нужен просто скрипт, запускающийся по таймеру, а его вывод (если он есть) должен попадать в Telegram / Discord / Slack / Signal.
В Hermes это называется режим без агента (no-agent mode). Это система cron минус LLM.
┌──────────────────┐ ┌──────────────────┐
│ scheduler tick │ every │ run script │
│ (every N minutes)│ ──────▶ │ (bash or python) │
└──────────────────┘ └──────────────────┘
│
│ stdout
▼
┌──────────────────┐
│ delivery router │
│ (telegram/disc…) │
└──────────────────┘
-
Нет вызова LLM. Ноль токенов, ноль циклов агента, ноль затрат на модель.
-
Скрипт — это задача. Скрипт сам решает, нужно ли предупреждение. Выдаёт вывод → сообщение отправляется. Ничего не выдаёт → тихий тик.
-
Bash или Python. Файлы
.sh/.bashзапускаются через/bin/bash; любое другое расширение — через текущий интерпретатор Python. Принимается любой файл в~/.hermes/scripts/. -
Тот же планировщик. Живёт в
cronjobвместе с LLM-заданиями — пауза, возобновление, список, логи и настройка доставки работают одинаково.
Когда это использовать
Используйте режим без агента для:
-
Сторожей памяти / диска / GPU. Запуск каждые 5 минут, оповещение только при превышении порога.
-
CI-хуков. Деплой завершён → отправить SHA коммита. Сборка упала → отправить последние 100 строк лога.
-
Периодических метрик. «Ежедневная выручка Stripe в 9 утра» как простой API-запрос и форматированный вывод.
-
Внешних опросчиков событий. Проверить API, оповестить об изменении состояния.
-
Heartbeat'ов. Пинговать панель каждые N минут, чтобы доказать, что хост жив.
Используйте обычное (LLM-управляемое) cron-задание, когда агенту нужно решить, что сказать — резюмировать длинный документ, выбрать интересные элементы из ленты, составить дружелюбное сообщение. Путь без агента — для случаев, когда stdout скрипта УЖЕ является сообщением.
Создать из чата
Главное преимущество режима без агента в том, что сам агент может настроить для вас сторожа — без редактора, без терминала, без запоминания флагов CLI. Вы описываете, что хотите, Hermes пишет скрипт, планирует его и сообщает, когда он сработает.
Пример диалога
Вы: пингуй меня в telegram, если RAM превышает 85%, каждые 5 минут
Hermes: (пишет
~/.hermes/scripts/memory-watchdog.sh, затем вызываетcronjob(...)сno_agent=true)Настроено. Запускается каждые 5 мин, оповещает Telegram только когда RAM выше 85%. Скрипт:
memory-watchdog.sh. ID задания:abc123.
Под капотом агент делает два вызова инструментов:
# 1. Write the check script
write_file(
path="~/.hermes/scripts/memory-watchdog.sh",
content='''#!/usr/bin/env bash
ram_pct=$(free | awk '/^Mem:/ {printf "%d", $3 * 100 / $2}')
if [ "$ram_pct" -ge 85 ]; then
echo "RAM ${ram_pct}% on $(hostname)"
fi
# Empty stdout = silent tick; no message sent.
''',
)
# 2. Schedule it — no_agent=True skips the LLM on every tick
cronjob(
action="create",
schedule="every 5m",
script="memory-watchdog.sh",
no_agent=True,
deliver="telegram",
name="memory-watchdog",
)
С этого момента каждый тик бесплатен: планировщик запускает скрипт, перенаправляет его stdout в Telegram (если он непустой) и никогда не обращается к модели.
Что агент решает за вас
Когда вы формулируете запрос вроде «предупреди меня, когда X» или «каждые N минут проверяй Y и сообщай, если Z», описание инструмента cronjob в Hermes подсказывает ему использовать no_agent=True всякий раз, когда содержание сообщения полностью определяется скриптом. Он переключается на обычный LLM-управляемый путь, когда запрос требует рассуждений («резюмируй новые issues», «выбери самые интересные заголовки», «составь дружеское напоминание»).
Вам не нужно указывать --no-agent самостоятельно. Просто опишите желаемое поведение.
Управление сторожами из чата
Агент может приостанавливать, возобновлять, редактировать и удалять задания так же, как и создавать их:
Вы: останови memory watchdog на сегодняшнюю ночь
Hermes: (вызывает
cronjob(action='pause', job_id='abc123'))Приостановлено. Возобновите командой «включи обратно» или через
hermes cron resume abc123.Вы: измени на каждые 15 минут
Hermes: (вызывает
cronjob(action='update', job_id='abc123', schedule='every 15m'))
Полный жизненный цикл (создание / список / обновление / пауза / возобновление / запуск сейчас / удаление) доступен агенту без необходимости изучать CLI-команды.
Создать из CLI
Предпочитаете терминал? Путь через CLI даёт тот же результат за три команды:
# 1. Write your script
cat > ~/.hermes/scripts/memory-watchdog.sh <<'EOF'
#!/usr/bin/env bash
# Alert when RAM usage is over 85%. Silent otherwise.
RAM_PCT=$(free | awk '/^Mem:/ {printf "%d", $3 * 100 / $2}')
if [ "$RAM_PCT" -ge 85 ]; then
echo "⚠ RAM ${RAM_PCT}% on $(hostname)"
fi
# Empty stdout = silent run; no message sent.
EOF
chmod +x ~/.hermes/scripts/memory-watchdog.sh
# 2. Schedule it
hermes cron create "every 5m" \
--no-agent \
--script memory-watchdog.sh \
--deliver telegram \
--name "memory-watchdog"
# 3. Verify
hermes cron list
hermes cron run <job_id> # fire it once to test
Вот и всё. Никакого промпта, никакого навыка, никакой модели.
Как вывод скрипта преобразуется в доставку
| Поведение скрипта | Результат |
|---|---|
| Выход 0, непустой stdout | stdout доставляется как есть |
| Выход 0, пустой stdout | Тихий тик — без доставки |
Выход 0, stdout содержит {"wakeAgent": false} в последней строке |
Тихий тик (общий шлюз с LLM-заданиями) |
| Ненулевой код выхода | Отправляется уведомление об ошибке (чтобы сломавшийся сторож не замолчал) |
| Тайм-аут скрипта | Отправляется уведомление об ошибке |
Поведение «тихо при пустом выводе» — ключ к классическому паттерну сторожа: скрипт может запускаться каждую минуту, но канал увидит сообщение только тогда, когда что-то действительно требует внимания.
Правила для скриптов
Скрипты должны находиться в ~/.hermes/scripts/. Это проверяется как при создании задания, так и во время выполнения — абсолютные пути, подстановка ~/ и паттерны обхода пути (../) отвергаются. Та же директория используется для скриптов предварительной проверки LLM-заданий.
Выбор интерпретатора определяется расширением файла:
| Расширение | Интерпретатор |
|---|---|
.sh, .bash |
/bin/bash |
| всё остальное | sys.executable (текущий Python) |
Мы намеренно НЕ обрабатываем шебанг-строки #!/... — явный и небольшой набор интерпретаторов снижает поверхность доверия планировщика.
Синтаксис расписания
Такой же, как и для всех остальных cron-заданий:
hermes cron create "every 5m" # интервал
hermes cron create "every 2h"
hermes cron create "0 9 * * *" # стандартный cron: ежедневно в 9 утра
hermes cron create "30m" # одноразовый: запустить один раз через 30 минут
Полный синтаксис см. в справочнике по функциям cron.
Цели доставки
--deliver принимает всё, что знает шлюз. Некоторые распространённые варианты:
--deliver telegram # домашний канал платформы
--deliver telegram:-1001234567890 # конкретный чат
--deliver telegram:-1001234567890:17585 # конкретная тема форума Telegram
--deliver discord:#ops
--deliver slack:#engineering
--deliver signal:+155****4567
--deliver local # просто сохранить в ~/.hermes/cron/output/
Для работы с платформами на токенах ботов (Telegram, Discord, Slack, Signal, SMS, WhatsApp) работающий шлюз не требуется во время выполнения скрипта — инструмент вызывает REST-эндпоинты каждой платформы напрямую, используя учётные данные из ~/.hermes/.env / ~/.hermes/config.yaml.
Редактирование и жизненный цикл
hermes cron list # показать все задания
hermes cron pause <job_id> # остановить выполнение, сохранить определение
hermes cron resume <job_id>
hermes cron edit <job_id> --schedule "every 10m" # изменить частоту
hermes cron edit <job_id> --agent # переключиться в режим LLM
hermes cron edit <job_id> --no-agent --script … # переключиться обратно
hermes cron remove <job_id> # удалить задание
Всё, что работает с LLM-заданиями (пауза, возобновление, ручной запуск, изменение цели доставки), работает и с заданиями без агента.
Пример: оповещение о заполнении диска
cat > ~/.hermes/scripts/disk-alert.sh <<'EOF'
#!/usr/bin/env bash
# Alert when / or /home is over 90% full.
THRESHOLD=90
df -h / /home 2>/dev/null | awk -v t="$THRESHOLD" '
NR > 1 && $5+0 >= t {
printf "⚠ Disk %s full on %s\\n", $5, $6
}
'
EOF
chmod +x ~/.hermes/scripts/disk-alert.sh
hermes cron create "*/15 * * * *" \
--no-agent \
--script disk-alert.sh \
--deliver telegram \
--name "disk-alert"
Молчит, когда обе файловые системы заполнены менее чем на 90%; отправляет ровно одну строку для каждой файловой системы, превысившей порог.
Сравнение с другими подходами
| Подход | Что запускается | Когда использовать |
|---|---|---|
cronjob --no-agent (эта страница) |
Ваш скрипт по расписанию Hermes | Повторяющиеся сторожа / оповещения / метрики, не требующие рассуждений |
cronjob (по умолчанию, с LLM) |
Агент с опциональным скриптом предпроверки | Когда содержание сообщения требует анализа данных |
OS cron + curl к подписке webhook |
Ваш скрипт по расписанию ОС | Когда Hermes может быть нездоров (объект мониторинга) |
Для критических сторожей системного здоровья, которые должны срабатывать даже когда шлюз недоступен, используйте cron на уровне ОС с обычным curl к подписке webhook Hermes (или любому внешнему endpoint'у оповещений) — они запускаются как независимые процессы ОС и не требуют работающего Hermes. Внутренний планировщик шлюза — правильный выбор, когда объект мониторинга является внешним.
Связанные материалы
-
Автоматизируйте что угодно с Cron — LLM-управляемые cron-паттерны.
-
Справочник «Планировщик задач (Cron)» — полный синтаксис расписания, жизненный цикл, маршрутизация доставки.
-
Подписки Webhook — HTTP-точки входа типа «забыл и отправил» для внешних планировщиков.
-
Внутреннее устройство шлюза — внутренности маршрутизатора доставки.