НейроАгент

Как настроить cron задачу каждые 10 секунд в CentOS 9 Stream

Полное руководство по настройке выполнения cron-задач каждые 10 секунд в CentOS 9 Stream с использованием systemd timers вместо устаревшего метода SLEEP.

Вопрос

Как настроить выполнение cron-задачи каждые 10 секунд в CentOS 9 Stream? На старом сервере CentOS 7 это решалось через SLEEP, но в CentOS 9 Stream cron не отрабатывает и не пишет логи. В консоли следующие команды работают:

          • sleep 0 ; /usr/bin/php -f /home/bitrix/ext_www/site.com/bitrix/php_interface/cron_events.php >> /home/bitrix/.bx_temp/site.com/log/cron_events.log 2>&1
          • sleep 10 ; /usr/bin/php -f /home/bitrix/ext_www/site.com/bitrix/php_interface/cron_events.php >> /home/bitrix/.bx_temp/site.com/log/cron_events.log 2>&1
          • sleep 20 ; /usr/bin/php -f /home/bitrix/ext_www/site.com/bitrix/php_interface/cron_events.php >> /home/bitrix/.bx_temp/site.com/log/cron_events.log 2>&1
          • sleep 30 ; /usr/bin/php -f /home/bitrix/ext_www/site.com/bitrix/php_interface/cron_events.php >> /home/bitrix/.bx_temp/site.com/log/cron_events.log 2>&1
          • sleep 40 ; /usr/bin/php -f /home/bitrix/ext_www/site.com/bitrix/php_interface/cron_events.php >> /home/bitrix/.bx_temp/site.com/log/cron_events.log 2>&1
          • sleep 50 ; /usr/bin/php -f /home/bitrix/ext_www/site.com/bitrix/php_interface/cron_events.php >> /home/bitrix/.bx_temp/site.com/log/cron_events.log 2>&1

Как правильно настроить выполнение скрипта каждые 10 секунд в CentOS 9 Stream?

НейроАгент

В CentOS 9 Stream стандартный cron не поддерживает выполнение задач чаще чем раз в минуту, поэтому метод с multiple sleep entries, работавший в CentOS 7, больше не функционирует. Для решения этой проблемы следует использовать systemd timers - современный и более надежный механизм для частых повторяющихся задач.

Содержание

Почему не работает метод с sleep в CentOS 9 Stream

CentOS 9 Stream использует более современную версию cron, которая имеет строгие ограничения на минимальный интервал выполнения задач. Как отмечено в документации, стандартный cron не может запускаться чаще чем раз в минуту.

Проблема с вашим подходом заключается в том, что:

  • Cron выполняет все задачи ровно в начале каждой минуты
  • При наличии нескольких задач в одной минуте, они запускаются последовательно, а не параллельно
  • Если одна задача занимает больше времени, чем интервал между запусками, это может вызвать конфликты

В отличие от CentOS 7, где такие обходные пути могли частично работать, в CentOS 9 Stream cron стал более строгим и отказывается выполнять некорректные конфигурации без видимых ошибок в логах.


Решение через systemd timers

Systemd timers являются оптимальным решением для задач, требующих выполнения чаще чем раз в минуту. Этот метод более эффективен и надежен, чем использование while loop с sleep.

Шаг 1: Создание systemd service файла

Создайте файл сервиса в /etc/systemd/system/cron_events.service:

ini
[Unit]
Description=Bitrix cron events service
After=network.target

[Service]
Type=simple
User=bitrix
Group=bitrix
ExecStart=/usr/bin/php -f /home/bitrix/ext_www/site.com/bitrix/php_interface/cron_events.php
WorkingDirectory=/home/bitrix/ext_www/site.com
Restart=always
RestartSec=10
StandardOutput=file:/home/bitrix/.bx_temp/site.com/log/cron_events.log
StandardError=file:/home/bitrix/.bx_temp/site.com/log/cron_events.log

Шаг 2: Создание systemd timer файла

Создайте соответствующий таймер в /etc/systemd/system/cron_events.timer:

ini
[Unit]
Description=Run cron events every 10 seconds
Requires=cron_events.service

[Timer]
OnUnitActiveSec=10s
OnBootSec=10s
AccuracySec=1ms

[Install]
WantedBy=timers.target

Шаг 3: Активация и запуск

bash
# Перезагрузка systemd
systemctl daemon-reload

# Включение таймера
systemctl enable cron_events.timer

# Запуск таймера
systemctl start cron_events.timer

# Проверка статуса
systemctl status cron_events.timer

Как отмечено в linuxconfig.org, директива OnUnitActiveSec=10 в юните таймера гарантирует выполнение задачи каждые 10 секунд.


Альтернативные методы для частых задач

Метод 1: Скрипт с while loop

Если по какой-то причине systemd не подходит, можно создать отдельный скрипт с бесконечным циклом:

bash
#!/bin/bash
# /usr/local/bin/cron_events_10sec.sh

while true; do
    /usr/bin/php -f /home/bitrix/ext_www/site.com/bitrix/php_interface/cron_events.php >> /home/bitrix/.bx_temp/site.com/log/cron_events.log 2>&1
    sleep 10
done

Затем добавить в crontab запуск этого скрипта каждую минуту:

* * * * * /usr/local/bin/cron_events_10sec.sh

Метод 2: Использование anacron

Для задач, которые не требуют абсолютной точности, можно рассмотреть использование anacron с настройками частого выполнения.

Метод 3: Несколько cron заданий с разными смещениями

Как упоминается в tecmint.com, можно создать несколько cron заданий с разными смещениями, но этот метод менее надежен для интервалов менее минуты.


Проверка и отладка конфигурации

Проверка статуса systemd таймера

bash
# Просмотр статуса таймера
systemctl status cron_events.timer

# Просмотр логов сервиса
journalctl -u cron_events.service -f

# Просмотр всех активных таймеров
systemctl list-timers --all

Проверка прав доступа

Убедитесь, что пользователь bitrix имеет необходимые права:

bash
# Проверка прав на выполнение PHP скрипта
ls -la /home/bitrix/ext_www/site.com/bitrix/php_interface/cron_events.php

# Проверка прав на запись в лог-файл
ls -la /home/bitrix/.bx_temp/site.com/log/

Тестовое выполнение

Для тестирования можно временно уменьшить интервал:

bash
# Временное изменение интервала на 30 секунд для теста
sed -i 's/OnUnitActiveSec=10s/OnUnitActiveSec=30s/' /etc/systemd/system/cron_events.timer
systemctl daemon-reload
systemctl restart cron_events.timer

Настройка прав доступа и безопасности

При настройке частых задач важно учитывать безопасность:

  1. Использование отдельного пользователя: Создайте специального пользователя для выполнения cron задач, а не используйте root.

  2. Ограничение прав: Установите минимально необходимые права на исполняемые файлы.

  3. Мониторинг ресурсов: Частые задачи могут нагружать систему, monitor используйте htop или top для отслеживания нагрузки.

  4. Логирование: Всегда настраивайте логирование для отслеживания ошибок и производительности.

  5. Ограничение времени выполнения: Установите разумные таймауты для задач, которые могут выполняться долго.


Сравнение cron vs systemd timers

Характеристика Cron Systemd Timers
Минимальный интервал 1 минута 1 миллисекунда
Точность Низкая Высокая
Управление процессами Базовое Продвинутое
Зависимости Ограниченные Гибкие
Логирование Базовое Интегрированное с journald
Перезапуск при сбое Нет Да
Ресурсоэффективность Низкая для частых задач Высокая

Как отмечают эксперты из anteru.net, systemd timers существенно превосходят традиционный cron по всем параметрам, особенно для частых и критически важных задач.

Источники

  1. How to Execute Less Than 1 Minute Interval Jobs Using Cron Time-Based Scheduler
  2. systemd as a replacement for cron every 10 seconds
  3. How to schedule tasks with systemd timers in Linux
  4. Replacing cron with systemd-timers
  5. How To Run a Cron Job Every 10, 20, and 30 Seconds in Linux
  6. Use systemd timers instead of cronjobs
  7. Can I run a cron job more frequently than every minute?

Заключение

Для настройки выполнения скрипта каждые 10 секунд в CentOS 9 Stream рекомендуется использовать systemd timers вместо традиционного cron. Этот подход:

  • Предоставляет высокую точность тайминга (до миллисекунд)
  • Обеспечивает надежный перезапуск при сбоях
  • Интегрируется с системой логирования journald
  • Более эффективен с точки зрения использования ресурсов
  • Позволяет гибко управлять зависимостями и правами доступа

Для решения вашей конкретной задачи с Bitrix cron_events.php создайте systemd service и timer файлы, как описано выше, и активируйте их. Это обеспечит надежную и предсказуемую работу вашего скрипта каждые 10 секунд без проблем, связанных с ограничениями cron.

Если вам нужно выполнить несколько разных задач с разными интервалами, создайте отдельные service и timer файлы для каждой из них.