Перейти к основному содержимому

Скриптовые Cron-задачи

Иногда вы уже точно знаете, какое сообщение хотите отправить. Вам не нужен агент, чтобы обдумывать его — вам просто нужен скрипт, запускающийся по таймеру, и его вывод (если он есть), попадающий в Telegram / Discord / Slack / Signal.

VibeOS называет это режимом без агента. Это система cron минус LLM.

   ┌──────────────────┐          ┌──────────────────┐
│ тик планировщика │ каждые │ запуск скрипта │
│ (каждые N минут) │ ──────▶ │ (bash или python)│
└──────────────────┘ └──────────────────┘
│
│ stdout
▼
┌──────────────────┐
│ маршрутизатор │
│ доставки │
│ (telegram/disc…) │
└──────────────────┘
  • Нет вызова LLM. Ноль токенов, ноль циклов агента, ноль затрат на модель.
  • Скрипт — это задача. Скрипт решает, нужно ли предупреждать. Выдаёт вывод → сообщение отправляется. Не выдаёт ничего → тихий тик.
  • Bash или Python. Файлы .sh / .bash выполняются через /bin/bash; любое другое расширение — через текущий интерпретатор Python. Принимаются любые файлы в ~/.vibeos/scripts/.
  • Тот же планировщик. Живёт в cronjob вместе с LLM-задачами — пауза, возобновление, список, логи и настройка доставки работают одинаково.

Когда использовать​

Используйте режим без агента для:

  • Сторожей памяти / диска / GPU. Запуск каждые 5 минут, оповещение только при превышении порога.
  • CI-хуков. Развёртывание завершено → опубликовать SHA коммита. Сборка не удалась → отправить последние 100 строк лога.
  • Периодических метрик. «Ежедневная выручка Stripe в 9 утра» как простой вызов API + красивое форматирование.
  • Внешних опросчиков событий. Проверить API, оповестить об изменении состояния.
  • Heartbeat-сигналов. Пинговать панель управления каждые N минут, чтобы подтвердить, что хост жив.

Используйте обычную (управляемую LLM) cron-задачу, когда агенту нужно решить, что сказать — обобщить длинный документ, выбрать интересные пункты из ленты, составить дружественное сообщение. Путь без агента — для случаев, когда stdout скрипта УЖЕ является сообщением.

Создание через чат​

Настоящее преимущество режима без агента в том, что сам агент может настроить для вас сторожа — без редактора, без оболочки, без запоминания флагов CLI. Вы описываете, что хотите, VibeOS пишет скрипт, планирует его и сообщает, когда он сработает.

Пример диалога​

Вы: пингуй меня в телеграм, если RAM больше 85%, каждые 5 минут

VibeOS: (пишет ~/.vibeos/scripts/memory-watchdog.sh, затем вызывает cronjob(...) с no_agent=true)

Настроено. Запускается каждые 5 мин, оповещает Telegram только когда RAM превышает 85%. Скрипт: memory-watchdog.sh. ID задачи: abc123.

Под капотом агент делает два вызова инструментов:

# 1. Написать проверочный скрипт
write_file(
path="~/.vibeos/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}% на $(hostname)"
fi
# Пустой stdout = тихий тик; сообщение не отправляется.
''',
)

# 2. Запланировать его — no_agent=True пропускает LLM на каждом тике
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 в VibeOS указывает ему использовать no_agent=True всякий раз, когда содержимое сообщения полностью определяется скриптом. Он возвращается к обычному пути с LLM, когда запрос требует рассуждений («обобщи новые проблемы», «выбери самые интересные заголовки», «составь дружеское напоминание»).

Вам не нужно указывать --no-agent самостоятельно. Просто опишите поведение.

Управление сторожевыми задачами из чата​

Агент может приостанавливать, возобновлять, редактировать и удалять задачи так же, как и создавать их:

Вы: останови сторожевую задачу памяти на сегодняшнюю ночь

VibeOS: (вызывает cronjob(action='pause', job_id='abc123'))

Приостановлено. Возобновите командой «включи обратно» или через vibeos cron resume abc123.

Вы: измени на каждые 15 минут

VibeOS: (вызывает cronjob(action='update', job_id='abc123', schedule='every 15m'))

Полный жизненный цикл (создание / список / обновление / пауза / возобновление / запуск сейчас / удаление) доступен агенту без необходимости изучать какие-либо команды CLI.

Создание через CLI​

Предпочитаете оболочку? Путь через CLI даёт тот же результат тремя командами:

# 1. Напишите свой скрипт
cat > ~/.vibeos/scripts/memory-watchdog.sh <<'EOF'
#!/usr/bin/env bash
# Оповещение, когда использование RAM превышает 85%. Иначе молчание.
RAM_PCT=$(free | awk '/^Mem:/ {printf "%d", $3 * 100 / $2}')
if [ "$RAM_PCT" -ge 85 ]; then
echo "⚠ RAM ${RAM_PCT}% на $(hostname)"
fi
# Пустой stdout = тихий запуск; сообщение не отправляется.
EOF
chmod +x ~/.vibeos/scripts/memory-watchdog.sh

# 2. Запланируйте его
vibeos cron create "every 5m" \
--no-agent \
--script memory-watchdog.sh \
--deliver telegram \
--name "memory-watchdog"

# 3. Проверьте
vibeos cron list
vibeos cron run <job_id> # запустите один раз для теста

Вот и всё. Никакого промпта, никакого навыка, никакой модели.

Как вывод скрипта сопоставляется с доставкой​

Поведение скриптаРезультат
Выход 0, непустой stdoutstdout доставляется дословно
Выход 0, пустой stdoutТихий тик — без доставки
Выход 0, stdout содержит {"wakeAgent": false} в последней строкеТихий тик (общий шлюз с LLM-задачами)
Ненулевой код выходаДоставляется оповещение об ошибке (чтобы сломанный сторож не молчал)
Тайм-аут скриптаДоставляется оповещение об ошибке

Поведение «тишина при пустом выводе» — ключ к классическому шаблону сторожевой задачи: скрипт может выполняться каждую минуту, но канал видит сообщение только тогда, когда что-то действительно требует внимания.

Правила для скриптов​

Скрипты должны находиться в ~/.vibeos/scripts/. Это проверяется как при создании задачи, так и во время выполнения — абсолютные пути, подстановка ~/ и шаблоны обхода пути (../) отклоняются. Этот же каталог используется для шлюза предварительной проверки в LLM-задачах.

Выбор интерпретатора — по расширению файла:

РасширениеИнтерпретатор
.sh, .bash/bin/bash
всё остальноеsys.executable (текущий Python)

Мы намеренно НЕ учитываем шебанг #!/... — явный и ограниченный набор интерпретаторов уменьшает поверхность, которой доверяет планировщик.

Синтаксис расписания​

Такой же, как и для всех остальных cron-задач:

vibeos cron create "every 5m"        # интервал
vibeos cron create "every 2h"
vibeos cron create "0 9 * * *" # стандартный cron: ежедневно в 9 утра
vibeos cron create "30m" # одноразово: запустить один раз через 30 минут

Полный синтаксис см. в справочнике по cron.

Цели доставки​

--deliver принимает всё, что знает шлюз. Некоторые распространённые варианты:

--deliver telegram                       # домашний канал платформы
--deliver telegram:-1001234567890 # конкретный чат
--deliver telegram:-1001234567890:17585 # конкретная тема форума Telegram
--deliver discord:#ops
--deliver slack:#engineering
--deliver signal:+15551234567
--deliver local # просто сохранить в ~/.vibeos/cron/output/

Для платформ с токенами ботов (Telegram, Discord, Slack, Signal, SMS, WhatsApp) во время выполнения скрипта не требуется работающий шлюз — инструмент напрямую вызывает REST-эндпоинты каждой платформы, используя учётные данные, уже находящиеся в ~/.vibeos/.env / ~/.vibeos/config.yaml.

Редактирование и жизненный цикл​

vibeos cron list                                    # просмотреть все задачи
vibeos cron pause <job_id> # остановить выполнение, сохранить определение
vibeos cron resume <job_id>
vibeos cron edit <job_id> --schedule "every 10m" # изменить периодичность
vibeos cron edit <job_id> --agent # переключить в режим LLM
vibeos cron edit <job_id> --no-agent --script … # переключить обратно
vibeos cron remove <job_id> # удалить задачу

Всё, что работает с LLM-задачами (пауза, возобновление, ручной запуск, изменение цели доставки), работает и с задачами без агента.

Пример: Оповещение о дисковом пространстве​

cat > ~/.vibeos/scripts/disk-alert.sh <<'EOF'
#!/usr/bin/env bash
# Оповещение, когда / или /home заполнены более чем на 90%.
THRESHOLD=90
df -h / /home 2>/dev/null | awk -v t="$THRESHOLD" '
NR > 1 && $5+0 >= t {
printf "⚠ Диск %s заполнен на %s на %s\n", $5, $6, hostname
}
'
EOF
chmod +x ~/.vibeos/scripts/disk-alert.sh

vibeos cron create "*/15 * * * *" \
--no-agent \
--script disk-alert.sh \
--deliver telegram \
--name "disk-alert"

Молчание, когда обе файловые системы заполнены менее чем на 90%; отправляет ровно одну строку для каждой файловой системы, превысившей порог, когда одна из них заполняется.

Сравнение с другими подходами​

ПодходЧто выполняетсяКогда использовать
cronjob --no-agent (эта страница)Ваш скрипт по расписанию VibeOSПовторяющиеся сторожевые задачи / оповещения / метрики, не требующие рассуждений
cronjob (по умолчанию, с LLM)Агент с опциональным скриптом предварительной проверкиКогда содержимое сообщения требует анализа данных
Системный cron + curl к вебхук-подпискеВаш скрипт по расписанию ОСКогда VibeOS может быть нездоров (то, что вы мониторите)

Для критически важных сторожевых задач, которые должны срабатывать даже когда шлюз недоступен, используйте системный cron с обычным curl к вебхук-подписке VibeOS (или любой внешней конечной точке оповещения) — они выполняются как независимые процессы ОС и не зависят от работы VibeOS. Встроенный планировщик — правильный выбор, когда мониторится внешний объект.

Связанные разделы​