
2024-05-10
crontab и incrontab - как настроить кроны
2023-11-02
Рано или поздно любой разработчик или сисдамин сталкивается с тем, что ему необходимо запускать какой-либо скрипт раз в какой-то период. Именно с этой задачей помогает справляться CRON. Это планироващик, который позволяет выполнять нужные вам скрипты раз в минуту, раз в час, раз в день, неделю, месяц, а также в любое заданное вами время или через любой интервал. В данной статье я расскажу как ею пользоваться и какие есть варианты ее использования в разработке приложений.
Фактически, CRON - это сервис, который запускается при старте системы и работает в фоновом режиме. Его задача выполнять конкретные скрипты в нужное время.
Чтобы вызвать окно настройки cron в linux нужно ввести команду
crontab -e
Флаг -e позволяет открыть ваш текстовый редактор по-умолчанию. Эта команда открывает временный файл, в котором уже представлены все текущие правила cron и вы можете добавить туда новые. После завершения работы команды cron файл будет обработан и все правила будут добавлены в /var/spool/cron/crontabs/имя_пользователя причем добавленные процессы будут запускаться именно от того пользователя, кто их добавил. Поэтому нужно быть аккуратным, и если вам нужно выполнять скрипты от какого-то конкретного пользователя - то из-под него и нужно запускать команду.
Синтаксис crontab выглядит следующим образом:
minute hour day month day_of_week /path/to/executable/file
Предположим, что у нас есть какой-то скрипт, например /home/www/bin/console app:cahce:clear и мы хотим его как-то запускать. Какие же у нас есть возможности и варианты?
* * * * * /home/www/bin/console app:cahce:clear
В указанном выше случае скрипт будет запускаться каждую минуту.
Допустим мы хотим, чтобы скрипт запускался каждый час в нулевую минуту. Тогда это будет выглядеть так:
0 * * * * /home/www/bin/console app:cahce:clear
Запускаем в нулевую минуту нулевого часа, каждый день, это в 12 часов ночи:
0 0 * * * /home/www/bin/console app:cahce:clear
Можем запустить в любой день, например 15 числа:
0 0 15 * * /home/www/bin/console app:cahce:clear
В первый день недели первого месяца года, 0 часов 0 минут:
0 0 * 1 0 /home/www/bin/console app:cahce:clear
Или в нулевой день недели каждого месяца:
0 0 * * 0 /home/www/bin/console app:cahce:clear
Вы можете выбрать любую минуту, час и день недели, например, 15:30 во вторник:
30 15 * * 2 /home/www/bin/console app:cahce:clear
Еще можно писать сокращенное название дня недели, например sun - воскресенье:
30 15 * * sun /home/www/bin/console app:cahce:clear
Для того, чтобы указать интервал, мы можем использовать символ "-", например, каждый час, с семи утра до семи вечера:
0 7-19 * * * /home/www/bin/console app:cahce:clear
Если мы хотим запускать команду несколько раз, то можно использовать разделитель ",". Например каждую 5 и 35 минуту пятого, каждый день ( 16:05 и 16:35 ):
5,35 16 * * * /home/www/bin/console app:cahce:clear
Вы также можете захотеть не указывать конкретное время, а просто указать интервал с которым нужно запускать скрипт, например, раз в 10 минут:
*/10 * * * * /home/www/bin/console app:cahce:clear
Помимо вышеуказанных примеров есть еще набор часто используемых переменных:
Например вот так вот будет выглядеть команда запуска скрипта раз в час:
@hourly /home/www/bin/console app:cahce:clear
Также вы можете захотеть, чтобы процесс запускался только в одном экземпляре всегда. Например, если скрипт у вас работает долго, но при этом вы запускаете его раз в минуту, чтобы после запуска в 1 минуту скрипт бы не стартанул во 2 минуту - можно указать setlock следующим образом:
* * * * * /usr/local/bin/setlock -nx /tmp/cache_clear /usr/bin/php /home/www/bin/console app:cache:clear
В данном случае мы используем утилиту setlock таким образом, что он создает временный файл /tmp/cache_clear и не запускает дубликатов процессов до тех пор пока предыдущий не отработает. Часто это бывает очень полезной функцией.
Утилита полезна тем, что помогает отслеживать состояние файлов и в зависимости от события файла производить то или иное действие.
Для чего это может быть использовано, например, если вам нужно перезагрузить nginx при изменении его настроек. Предположим, что у вас в приложении есть система отслеживания и блокировки пользователей по ip. Вы можете добавлять в конфигурационный файл ip пользователя для блокировки и использовать incrontab для ребута nginx и применения настроек.
Если incrontab не установлен, то установить его можно используя команду
sudo apt install incron
Чтобы запустить редактирование incron настроек - нужно также, как и в случае с cron запустить команду
incrontab -e
Формат записи нативен и прост:
<path> <mask> <command>
В качестве <path> - необходимо указать путь до директории или файла за которым вы хотите следить.
В каечестве <mask> может выступать одно из значений:
В качестве <command> - необходимо указать команду, исполняемую по одному из вышеуказанных триггеров. В команде может быть использован один из нижеуказанных паттернов, который будет подменен значением:
После установки и настройки incrontab - вам потребуется его запустить используя команду
/etc/init.d/incrond start
OR
systemctl start incron.service
После этого вы можете проверить статус сервиса:
systemctl status incron.service
Также вам возможно потребуется добавить пользователя в /etc/incron.allow конфигурационный файл - это нужно для того, чтобы у пользователя был доступ к сервису incron в случае, если его нет.
А вот несколько примеров:
/etc/apache2/apache2.conf IN_MODIFY /usr/sbin/service apache2 stop
/tmp/gfg/myfile.txt IN_ACCESS echo "$$ $@ $# $% $&" - вывод этой команды можно будет увидеть в логах /var/log/syslog
Ура! Я наконец-то дописал статью как собирать собственные бандлы на Symfony 6!!!
Статья про EasyAdmin всё ещё в процессе )))
Не, ну мне же надо на чем-то тестировать твиттер локальный...
Я тут еще много полезного буду выкладывать, так что заходите обязательно почитать.
Сайтик пока что в разработке - это далеко не окончательная версия - по сути это то что удалось слепить за 8 часов.
Комментарии
Stas
2023-11-03 05:52:26