Главная страница / Блог / Настройка выполнения агентов Битрикс через systemd (cron)
Linux

Настройка выполнения агентов Битрикс через systemd (cron)

30 июня 2026 10 минут чтения 5400 просмотров

Агенты в 1С-Битрикс — это встроенный механизм выполнения фоновых задач. Именно они отвечают за отправку почты, очистку временных данных, обновление системной информации, выполнение запланированных действий и множество других процессов, необходимых для нормальной работы сайта.

Если говорить языком официальной документации, агент — это обычная PHP-функция, которая должна выполняться с определенной периодичностью. В базе данных хранится информация о том, какой код необходимо выполнить, когда его запускать и по каким правилам рассчитывать время следующего запуска:

  • какую функцию необходимо выполнить;
  • когда она должна быть запущена;
  • как часто необходимо выполнять агент;
  • каким способом рассчитывается время следующего запуска.

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

Важно. Именно эта особенность и становится причиной большинства проблем с агентами.

Как работают агенты Битрикс

Стандартные агенты отвечают за отправку почты, очистку служебных данных, обновление информации, выполнение внутренних задач системы, проверку обновлений и многое другое. При необходимости можно создавать и собственные агенты для выполнения любых PHP-функций.

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

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

Совсем другая ситуация возникает на проектах с небольшой посещаемостью. Пока на сайт никто не заходит, агенты просто ждут своей очереди. Со временем они начинают накапливаться и выполняются только тогда, когда пользователь снова откроет любую страницу сайта.

В результате первому посетителю приходится ждать не только генерацию страницы, но и выполнение всех накопившихся фоновых задач. Иногда это практически незаметно, а иногда именно из-за агентов сайт начинает ощутимо "подтормаживать".

Чтобы исключить подобную ситуацию, лучше отвязать выполнение агентов от посещаемости сайта и запускать их по расписанию средствами операционной системы.

Почему лучше запускать агентов по расписанию

Для этой задачи традиционно использовался планировщик cron . Однако в современных дистрибутивах Linux все чаще применяется systemd timers , который позволяет гибко управлять службами и расписанием их запуска.

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

Настройка агентов Битрикс через systemd

Шаг 1. Отключаем выполнение агентов по хитам

Откройте административную часть сайта и перейдите в раздел Настройки → Инструменты → Командная PHP-строка .

Выполните следующий код:

COption::SetOptionString("main", "agents_use_crontab", "N");
echo COption::GetOptionString("main", "agents_use_crontab", "N");
COption::SetOptionString("main", "check_agents", "N");
echo COption::GetOptionString("main", "check_agents", "Y");

Если все прошло успешно, на экране появится значение NN .

Шаг 2. Настраиваем ядро Битрикс

Теперь откройте файл: /home/bitrix/ext_www/example.com/bitrix/php_interface/dbconn.php

Если используется обычная установка без мультисайтовости, путь, скорее всего, будет выглядеть так: /home/bitrix/www/bitrix/php_interface/dbconn.php

Если в файле присутствуют строки:

define("BX_CRONTAB_SUPPORT", true);
define("BX_CRONTAB", true);

их необходимо удалить или закомментировать.

После этого добавьте в конец файла:

if (!(defined("CHK_EVENT") && CHK_EVENT === true))
	define("BX_CRONTAB_SUPPORT", true);

В этой же директории создайте файл cron_events.php и поместите в него следующий код:

$_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__FILE__) . "/../..");
$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"];
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS", true);
define("BX_NO_ACCELERATOR_RESET", true);
define("CHK_EVENT", true);
define("BX_WITH_ON_AFTER_EPILOG", true);
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");

@set_time_limit(0);
@ignore_user_abort(true);

CAgent::CheckAgents();
define("BX_CRONTAB_SUPPORT", true);
define("BX_CRONTAB", true);
CEvent::CheckEvents();
if (CModule::IncludeModule('sender')) {
    \Bitrix\Sender\MailingManager::checkPeriod(false);
    \Bitrix\Sender\MailingManager::checkSend();
}

require($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/tools/backup.php");
CMain::FinalActions();

Шаг 3. Создаем службу systemd

Перейдите в каталог: /etc/systemd/system

Создайте файл bitrix-agents.service со следующим содержимым:

[Unit]
Description=Bitrix agents for example.com

[Service]
User=bitrix
Group=bitrix
ExecStart=/usr/bin/php -f /home/bitrix/ext/bitrix/php_interface/cron_events.php
Важно. Обратите внимание на путь в строке ExecStart. Он должен соответствовать местоположению ранее созданного нами файла cron_events.php.

После этого создайте таймер bitrix-agents.timer . Важно, чтобы имена файлов совпадали, отличалось только расширение.

[Unit]
Description=Bitrix agents timer for example.com

[Timer]
OnCalendar=*:0/1

[Install]
WantedBy=timers.target

Строка OnCalendar=*:0/1 означает запуск службы один раз в минуту. Для выполнения агентов этого более чем достаточно.

Шаг 4. Проверяем конфигурацию

Перед запуском таймера желательно проверить конфигурацию:

systemctl daemon-reload
systemd-analyze verify /etc/systemd/system/bitrix-agents.service
systemd-analyze verify /etc/systemd/system/bitrix-agents.timer

Если ошибок нет, запускаем таймер:

systemctl start bitrix-agents.timer
systemctl enable bitrix-agents.timer

После этого systemd будет запускать службу каждую минуту, а та, в свою очередь, выполнит файл cron_events.php , который обработает очередь агентов и событий Битрикса.

Проверяем результат

Убедиться, что таймер работает, можно командой:

systemctl list-timers

В списке должен присутствовать ваш таймер со временем следующего запуска.

Также можно открыть административную панель Битрикс и перейти в раздел Настройки → Настройки продукта → Агенты . Если время последнего запуска регулярно обновляется, значит настройка выполнена правильно.

Шпаргалка по упрпавлению службами systemd.

Заключение

После перевода агентов на systemd их выполнение больше не зависит от посещаемости сайта. Фоновые задачи будут запускаться строго по расписанию, а пользователи перестанут испытывать задержки из-за накопившейся очереди агентов. Такая настройка особенно полезна для небольших проектов и интернет-магазинов, где стабильная скорость работы сайта напрямую влияет на удобство пользователей.

Как восстановить работу агентов по хитам

1. Из /bitrix/php_interface/dbconn.php удалить все определения констант BX_CRONTAB_SUPPORT и BX_CRONTAB

2. Далее в админ-панели сайта Рабочий стол - Настройки - Инструменты - SQL запрос. Проверим наличие строк в базе

SELECT * FROM b_option WHERE NAME LIKE '%cron%'; 
SELECT * FROM b_option WHERE NAME LIKE '%agents%';
Если строки в наличии, удаляем
DELETE FROM b_option WHERE NAME = 'agents_use_crontab'; 
DELETE FROM b_option WHERE NAME = 'check_agents';

3. Отключаем таймер

systemctl stop bitrix-agents.timer
systemctl disable bitrix-agents.timer

Комментарии

Будем рады вашему мнению и вопросам по статье.

Сергей

Отличная статья, спасибо!

Только в файле cron_events.php нужно теги <? и ?> добавить в начало и конец соответственно, иначе интерпретатор php его не обработает.