Как настроить выполнение 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
- Решение через systemd timers
- Альтернативные методы для частых задач
- Проверка и отладка конфигурации
- Настройка прав доступа и безопасности
- Сравнение cron vs 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:
[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:
[Unit]
Description=Run cron events every 10 seconds
Requires=cron_events.service
[Timer]
OnUnitActiveSec=10s
OnBootSec=10s
AccuracySec=1ms
[Install]
WantedBy=timers.target
Шаг 3: Активация и запуск
# Перезагрузка 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 не подходит, можно создать отдельный скрипт с бесконечным циклом:
#!/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 таймера
# Просмотр статуса таймера
systemctl status cron_events.timer
# Просмотр логов сервиса
journalctl -u cron_events.service -f
# Просмотр всех активных таймеров
systemctl list-timers --all
Проверка прав доступа
Убедитесь, что пользователь bitrix имеет необходимые права:
# Проверка прав на выполнение PHP скрипта
ls -la /home/bitrix/ext_www/site.com/bitrix/php_interface/cron_events.php
# Проверка прав на запись в лог-файл
ls -la /home/bitrix/.bx_temp/site.com/log/
Тестовое выполнение
Для тестирования можно временно уменьшить интервал:
# Временное изменение интервала на 30 секунд для теста
sed -i 's/OnUnitActiveSec=10s/OnUnitActiveSec=30s/' /etc/systemd/system/cron_events.timer
systemctl daemon-reload
systemctl restart cron_events.timer
Настройка прав доступа и безопасности
При настройке частых задач важно учитывать безопасность:
-
Использование отдельного пользователя: Создайте специального пользователя для выполнения cron задач, а не используйте
root. -
Ограничение прав: Установите минимально необходимые права на исполняемые файлы.
-
Мониторинг ресурсов: Частые задачи могут нагружать систему, monitor используйте
htopилиtopдля отслеживания нагрузки. -
Логирование: Всегда настраивайте логирование для отслеживания ошибок и производительности.
-
Ограничение времени выполнения: Установите разумные таймауты для задач, которые могут выполняться долго.
Сравнение cron vs systemd timers
| Характеристика | Cron | Systemd Timers |
|---|---|---|
| Минимальный интервал | 1 минута | 1 миллисекунда |
| Точность | Низкая | Высокая |
| Управление процессами | Базовое | Продвинутое |
| Зависимости | Ограниченные | Гибкие |
| Логирование | Базовое | Интегрированное с journald |
| Перезапуск при сбое | Нет | Да |
| Ресурсоэффективность | Низкая для частых задач | Высокая |
Как отмечают эксперты из anteru.net, systemd timers существенно превосходят традиционный cron по всем параметрам, особенно для частых и критически важных задач.
Источники
- How to Execute Less Than 1 Minute Interval Jobs Using Cron Time-Based Scheduler
- systemd as a replacement for cron every 10 seconds
- How to schedule tasks with systemd timers in Linux
- Replacing cron with systemd-timers
- How To Run a Cron Job Every 10, 20, and 30 Seconds in Linux
- Use systemd timers instead of cronjobs
- 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 файлы для каждой из них.