Настройка запуска Cron Moodle в Windows Server 2012R2

Дано: система электронного обучения LMS Moodle установлена в IIS на Windows Server 2012 R2.
Задача: настроить периодический запуск специального файла cron.php



Что такое cron в Moodle и почему он важен? Это специальная сервисная процедура, которая обслуживает процессы, происходящие в системе мудл, такие как очистка данных, резервирование, отправка оповещений и т.п. Если ее не запускать, то нормальная работа система может быть нарушена.

Если крон не запускался более суток, то администратор увидит об этом сообщение, если перейдет в административном меню по ссылке "Уведомления":


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

Крон может запускаться как из браузера, так и прямым доступом к его файлу: cron.php.

Например, можно проверить работу крона перейдя по адресу:
<URL-адрес Moodle>/admin/cron.php

Если при переходе по данному адресу появилось сообщение: "!!! Извините, доступ к этой странице через интернет заблокирован администратором. !!!", то значит возможность запуска крона из браузера заблокирована.

Желательно, чтобы возможность запуска крона из браузера была отключена в целях безопасности. Чтобы это сделать, в административном меню Moodle переходим:
/ Администрирование
/ Безопасность
/ Политика безопасности сайта


На открывшейся странице находим и устанавливаем параметр "Запуск cron только из командной строки (cronclionly)"
Если этот параметр установлен, то cron может быть запущен только из командной строки, а не через веб-интерфейс.


Теперь необходимо настроить запуск крона из командной строки.

На странице официальной документации - https://docs.moodle.org/29/en/Cron_with_Windows_OS как самый быстрый способ настройки - предлагают установить специальную утилиту, которая создаст службу в системе Windows. Однако данная служба будет запускать крон из браузера, а мы эту возможность отключили. Поэтому способ не подходит.

Запуск крона будем настраивать через стандартный планировщик системы Windows - Task Scheduler.

Предварительно создайте пользователя в системе, например, usercron. Его учетную запись будем использовать для запуска процесса крона. Для создания системного профиля один раз заходим под этим пользователем в систему.
Также даем право modify данному пользователю на папку с данными Moodle.

Далее создаем bat-файл (например, cron.bat) со следующим содержимым (скриптом):

@echo off
set PathPHP="C:\Program Files (x86)\PHP\v5.6\php.exe"
set PathCron="C:\inetpub\moodle\admin\cli\cron.php"
set PathLOG="D:\Logs\cronlogs"

%PathPHP% -f %PathCron% >> %PathLOG%\%date:~10,4%%date:~4,2%%date:~7,2%.log

Forfiles /P %PathLOG% /S /M *.log /D -5 /C "cmd /c del /q @path"

В данном скрипте необходимо правильно задать пути:
PathPHP - путь к запускному файлу php (его можно посмотреть по кнопке PHP Manager в IIS)
PathCron - абсолютный путь к файлу крона: <путь папки с Moodle>\admin\cli\cron.php
PathLOG - любое место, куда будут записываться логи крона

Данный скрипт запускает крон по указанному пути, результат его работы записывает в лог-файл, а также удаляет логи старше 5 дней.

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

При отработке крона в логах можно обнаружить такую ошибку:
Fatal error: $CFG->dataroot is not writable, admin has to fix directory permissions! Exiting.
Это означает, что пользователю usercron не заданы права записи на Moodle-папку для хранения данных. Задайте права, если Вы забыли это сделать.

Далее необходимо настроить планировщик таким образом, чтобы данный скрипт запускался, допустим, каждые 10 минут (либо можете настроить на каждые 5 минут).

Открываем встроенный планировщик Windows (Task Scheduler) и добавляем новую задачу:


На вкладке General новой задачи задаем поля имени задачи.
В блоке Security options нажимаем "Change User…" и указываем ранее созданного пользователя (usercron), задавая таким образом пользователя для запуска задачи.
Также выбираем параметр "Run whether user is logged on or not", чтобы задача выполнялась всегда, не зависимо от того, залогинен наш пользователь или нет.
Конфигурацию указываем - Windows Server 2012 R2:


На вкладке Триггеры (Triggers) нужно будет задать периодичность запуска задачи. Нажимаем кнопку New и настраиваем расписание запуска (я поставила на каждые 10 минут):


На вкладке Действия (Action) задаем, что нужно сделать.  Нажимаем кнопку New и выбираем "Start a program", а в поле "Program/script" указываем путь к только что созданному bat-файлу:


На вкладке Условия (Conditions) оставляем всё по умолчанию:


Настраиваем под себя вкладку Настройки (Settings):


После нажатия на ОК попросят ввести пароль указанного ранее пользователя, а затем может возникнуть сообщение:
This task requires that the user account specified has Log on as batch job rights


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

Если проигнорировать это сообщение, то при запуске задания будет возникать ошибка:
Task Scheduler failed to start "\Moodle Cron Service" task for user "ServerName\usercron". Additional Data: Error Value: 2147943785.

Нам нужно предоставить дополнительные привилегии для нашего пользователя (usercron). Для того запускаем в системе оснастку Local Security Policy:


В открывшемся окне находим ветку "Local Policies - User Rights Assignment":


Открываем настройку "Log on as a batch job" и к уже имеющемуся списку пользователей добавляем нашего usercron (по кнопке Add User or Group):


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

См. также Установка Moodle на Windows Server 2012 R2 и IIS
Другие инструкции по Moodle
(с) Ella S.
Если Вам понравилась статья, пожалуйста, поставьте лайк, сделайте репост или оставьте комментарий. Если у Вас есть какие-либо замечания, также пишите комментарии.

3 комментария:

  1. Спасибо тебе, Сисадминша... очень помогло

    ОтветитьУдалить
  2. Спасибо! Полдня убил на поиск решения. У Вас нашел. Спасибо!

    ОтветитьУдалить