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

Агенты не выполняются - разбор причин

Агенты числятся в списке, а фоновые задачи не выполняются. Разбираем причины в порядке убывания частоты.

С чего начать

Смотрим очередь агентов и время их запуска:

$res = CAgent::GetList(['NEXT_EXEC' => 'ASC'], ['ACTIVE' => 'Y']);
while ($agent = $res->Fetch()) {
printf("%-40s след=%s посл=%s\n",
mb_substr($agent['NAME'], 0, 40),
$agent['NEXT_EXEC'], $agent['LAST_EXEC'] ?: '(ни разу)');
}
// пустая дата последнего запуска означает, что очередь не разбиралась ни разу

Время следующего запуска в прошлом означает, что агенты стоят. Пустое время последнего выполнения означает, что агент не отрабатывал ни разу с момента создания.

Проверяем задание расписания и его окружение:

Окно терминала
crontab -l -u bitrix # задания пользователя сайта
grep -c cron_events /var/spool/cron/bitrix 2>/dev/null # заведён ли обработчик
# путь к PHP и путь к скрипту - две самые частые ошибки в задании
which php && php -v | head -1
tail -30 /home/bitrix/cron.log 2>/dev/null

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

Запускаем обработчик агентов руками:

Окно терминала
# так же, как это делает расписание: видно и ошибки, и отсутствие прав
sudo -u bitrix /usr/bin/php -f /home/bitrix/www/bitrix/php_interface/cron_events.php
echo "код возврата: $?"
# ненулевой код и пустой вывод - разные симптомы: первый про ошибку, второй про права

Ручной запуск от имени пользователя сайта отвечает сразу на два вопроса: доходит ли дело до кода платформы и не мешают ли права на файлы.

Причины

  1. Агенты работают на хитах, а посетителей нет примерно 30% случаев

    ПризнакНа тестовом сайте агенты стоят, на живом выполняются рывками и с задержкой.

    ПроверкаСмотрим настройку запуска агентов в параметрах главного модуля.

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

  2. В задании неверный путь к PHP или к скрипту примерно 25% случаев

    ПризнакЗадание в списке есть, журнал пуст, следов запуска нигде нет.

    ПроверкаЗапускаем ту же команду руками от имени пользователя сайта и смотрим вывод.

    Что делатьПрописываем полные пути к исполняемому файлу PHP и к обработчику агентов, вывод перенаправляем в файл.

  3. Расписание запускает другую версию PHP примерно 20% случаев

    ПризнакСайт работает, а запуск по расписанию падает на ошибке синтаксиса или отсутствующем расширении.

    ПроверкаСверяем версию PHP в командной строке с версией, которую показывает сайт.

    Что делатьУказываем в задании исполняемый файл нужной ветки PHP явно, а не короткое имя команды.

  4. Упавший агент блокирует очередь примерно 15% случаев

    ПризнакОдин агент отработал наполовину, остальные с этого момента стоят.

    ПроверкаСмотрим время следующего запуска у всех агентов: у сбойного оно застряло в прошлом.

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

  5. Нет прав на файлы или на запись в кэш примерно 10% случаев

    ПризнакРучной запуск от рута работает, от пользователя сайта - нет.

    ПроверкаЗапускаем обработчик от имени пользователя сайта и смотрим сообщения об отказе доступа.

    Что делатьПриводим владельца файлов сайта к пользователю веб-сервера; задания расписания заводим от того же пользователя.

Частые вопросы

Как часто запускать обработчик агентов?

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

Почему агент выполняется чаще, чем задано?

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

Куда смотреть, если агент выполняется, но ничего не делает?

В его собственный журнал: снаружи виден только факт запуска. Запись в файл в начале и в конце агента отвечает на этот вопрос за одну итерацию.

Нужно ли отключать агенты на хитах после перехода на расписание?

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

Смежное

Первоисточник