PHP - Управление cron'ом с помощью cron_manager.sh

2016-04-02
Cron, Bash, Linux

В каждом PHP проекте есть скрипты которые нужно запускать по крону. Когда таких скриптов становиться много, то возникает необходимость их хранить в каком-то конфиге проекта. А если еще и нет root доступа к серверу, то каждый раз дергать админа что бы он поставил какой то скрипт на крон, совсем не удобно. В этой статье пойдет речь о том, как управлять cron задачами в проекте, не имея root прав, с помощью скрипта cron_manager.sh.

Скрипт cron_manager.sh представляет собой удобный инструмент, который может считывать конфиги cron задач лежащие в папке проекта, и на их основе добавлять/изменять/удалять cron задачи в ОС сервера. Для этого скрипта не требуются root права. Cron задачи сохраняются в cron файл, который принадлежит текущему linux пользователю.

Скрипт cron_manager.sh не привязан конкретно к PHP, он может управлять задачами cron и в любых других проектах. Мы же рассмотрим пример именно с PHP для наглядности.

Скрипт имеет две команды:

  • update - для добавления/изменения/удаления cron задач на основе вашего конфига;
  • clear - для удаления всех cron задач вашего проекта.

Данный скрипт удобно использовать совместно с какой либо из систем CI, например Jenkins. Т.к. можно в скрипт сборки проекта написать команду, которая будет автоматически запускать cron_manager.sh.

Устанавливаем cron_manager.sh в ОС Linux

Удобней всего будет установить cron_manager.sh глобально в Linux, для этого выполняем следующие команды:

sudo su
cd /usr/local/bin/
wget -O cron_manager https://raw.githubusercontent.com/atoumus/cron_manager.sh/master/cron_manager.sh
chmod a+x cron_manager

После этих действий его можно будет просто запускать командой $ cron_mananger.

Создаем конфиг файл

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

* * * * * /var/www/site.com/test1.php

# Some comment
* * * * * /var/www/site.com/test2.php

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

Команда update

После того как конфиг создан, можно начинать использовать скрипт cron_manager.sh для добавления задач в cron.

У скрипта cron_manager.sh есть одна важная особенность. Текущий каталог воспринимается как корневой каталог проекта. Поэтому обязательно необходимо перейти в корневой каталог проекта.

Далее, из корневого каталога проекта, необходимо запустить команду update:

$ cron_manager update ./crontab

В выше приведенном примете ./crontab и является конфигом со списком cron задач, который лежит в вашем проекте. Этот конфиг файл может находиться и в каком либо подкаталоге, необязательно в корне проекта.

При выполнении команды update скрипт cron_manager.sh отобразит подробную инфо о том какие задачи были добавлены.

Если в конфиге ./crontab сделать какие либо изменения и повторно запустить команду update, то сделанные изменения также применяться в системном cron'е.

Так что все что нужно для управления cron задачами в проекте, это вносить их в конфиг файл и запускать команду update скрипта cron_manager.sh.

Команда clear

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

Прежде всего переходим в корневую папку проекта. После этого запускаем команду clear, при этом конфиг cron задач проекта указывать уже не нужно:

$ cron_manager clear

При выполнении этой команды скрипт cron_manager.sh также выдаст подробную инфу о том какие именно задачи были удалены из системного cron'а.