Cron — это демон, который можно использовать для назначения запуска повторяющихся заданий по расписанию, задаваемого по времени, дню месяца, месяцу, дню недели и неделям.
Cron подразумевает, что система работает непрерывно. Если система не была включена в момент, на который была назначено задание, оно не будет выполнено. За информацией о назначении одноразовых заданий, обратитесь к разделу 35.2 Задания at и batch.
Для использования службы cron, необходимо, чтобы был установлен RPM-пакет vixie-cron и работала служба crond. Чтобы определить, установлени ли этот пакет, выполните команду rpm -q vixie-cron. Чтобы определить, работает ли служба, воспользуйтесь командой /sbin/service crond status.
- Начало работы с Cron Jobs
- Crontab Logging
- Crontab Mail Silence
- Crontab Log and Silence Mail
- Crontab Mail
- How to Read Local Mail in Linux
- Edit /etc/aliases
- run-parts
- record the memory usage of the system every monday
- at 3:30AM in the file /tmp/meminfo
- Run Custom SCR īpt the first day of every month at 4:10AM
- Every morning at six o ‘clock
- Every two hours
- Every two hours between 11:00 p.m. and 8:00 a.m., 8:00 a.m
- On the 4th of the month and every Monday through Wednesday at 11 a.m
- At 4 o ‘clock in the morning on January 1st
- run-parts
- You may like:
- Запуск и остановка службы
- Управление доступом к cron
- Anacron
- Столкновение между Cron и Anacron
- Запуск и остановка службы
- Cron и PHP
- Как Cron интерпретирует файлы Crontab
- Разрешения Cron
- Настройка заданий cron
- Перекрытия задач
- Использование Flock
- Использование механизма блокировки в скриптах
- Файлы Crontab
- Анатомия записи Crontab
- Редактирование Crontab других пользователей
- Стандартные и нестандартные значения Crontab
- Диапазоны
- Списки
- Шаги
- Имена
- Предопределенные определения
- Несколько команд в одном задании Cron
- Переменные среды
- Разные часовые пояса
- Быстрое устранение неполадок
- Абсолютный путь к командам
- Убедитесь, что cron запущен
- Проверка /etc/cron.allowи /etc/cron.deny файлы
- Разрешение на выполнение
- Новый символ строки
- Терминология Cron Job
- Завершение
- Перенаправление вывода
- Отправьте вывод по электронной почте
Начало работы с Cron Jobs
Если мы заглянем внутрь /etc
каталога, то увидим такие каталоги, как cron.hourly
, cron.daily
, cron.weekly
и cron.monthly
, каждый из которых соответствует определенной частоте выполнения.
Одним из способов планирования наших задач является размещение наших сценариев в соответствующем каталоге. Например, для db_backup.php
ежедневного запуска мы поместили его внутрь cron.daily
. Если папка для данной частоты отсутствует, нам нужно будет сначала создать ее.
Этот подход использует run-parts
скрипт, команду, которая запускает каждый исполняемый файл, который он находит в указанном каталоге.
Это самый простой способ запланировать задачу. Однако, если нам нужна большая гибкость, мы должны использовать Crontab.
Вам нужно регулярно запускать скрипт, но вы не хотите запускать его вручную? Или, может быть, вам нужно выполнить команду в определенное время или интервал, но вы не хотите, чтобы процесс монополизировал ваш процессор или память. В любом случае cron jobs идеально подходят для этой задачи. Давайте посмотрим, что это такое, как их настроить и что с ними можно сделать.
Бывают случаи, когда в будущем необходимо автоматически запускать группу задач в определенное время. Эти задачи обычно являются административными, но могут быть любыми – от создания резервных копий базы данных до загрузки электронных писем, когда все спят.
Cron — это планировщик заданий на основе времени в Unix-подобных операционных системах, который запускает определенные задачи в будущем. Название происходит от греческого слова χρόνος (хронос), что означает время.
Наиболее часто используемая версия Cron известна как Vixie Cron. Пол Викси первоначально разработал его в 1987 году.
We are used to getting messages, and crontab provides them in various ways: email, syslog, log files. Here are some ways you can configure crontab to tell you what’s going on:
Crontab Logging
You can create a new log, or append to an old log
Crontab Mail Silence
/dev/null logging will also prevent weird script output that might terminate the crontab
Crontab Log and Silence Mail
It is a good idea to capture so syslog picks up errors (2>&1)
Crontab Mail
Sometimes when logging in you’ll see something like “You have new mail.” These could be crontab messages.
If you wish to change default mail to root instead edit your /etc/default/cron:
This file contains cron’s default settings.
How to Read Local Mail in Linux
You can easily read the mail by simply catting the file:
- alpine
- mutt
- mail/mailx
Configure the “MTA” aka /usr/sbin/sendmail to send to external mail as well so you can read it in your favorite external reader. Be advised that many of these messages could contain sensitive info.
Edit /etc/aliases
You will want to send them all to the box you check. For example you might edit your /etc/alias like so:
After you edit /etc/aliases you need run the newaliases command, which updates /etc/aliases.db
Test your mail configuration with the mail command:
Основной файл конфигурации cron, /etc/crontab, содержит следующие строки:
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # run-parts 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly
Первые четыре строки — это переменные, настраивающие среду окружения, в котором будут работать задачи cron. Значение переменной SHELL сообщает системе о том, какую оболочку использовать (в этом примере будет использована оболочка bash), а переменная PATH определяет пути, используемые для выполнения команд. Результат выполнения задач cron будет выслан по электронной почте пользователю, определённому в переменной MAILTO. Если в качестве значения переменной MAILTO задана пустая строка (MAILTO=""), электронные письма отправляться не будут. Переменная HOME задаёт домашний каталог, используемый при выполнения команд или сценариев.
Каждая строка в файле /etc/crontab имеет следующий формат:
minute hour day month dayofweek command
-
minute — любое целое число от 0 до 59
-
hour — любое целое от 0 до 23
-
day — любое целое от 1 до 31 (день должен быть корректным, если указан месяц)
-
month — любое целое от 1 до 12 (или короткое название месяца, например: jan, feb и так далее)
-
dayofweek — любое целое от 0 до 7, где 0 или 7 означает Воскресенье (или короткое название дня недели, например: sun, mon и так далее)
-
command — команда, которая должны быть выполнена. Командой может быть как простая команда, например, ls /proc >> /tmp/proc, или команда запуска написанного вами специального сценария.
Для любых указанных выше параметров можно использовать звездочку (*), что означает все допустимые значения. Например, если поставить звёздочку в значении месяца, команда будет выполняться каждый месяц во время, указанное другими параметрами.
Дефис (-) между целыми числами обозначает диапазон чисел. Например, 1-4 означает целые числа 1, 2, 3 и 4.
Список значений, разделенных запятыми (,), обозначает перечень. Например, перечисление 3, 4, 6, 8 означает четыре указанных целых числа.
Косая черта (/) используется для определения шага значений. Целочисленное значение может быть пропущено в диапазоне, если после диапазона указать /<целое>. Например, значение минут 0-59/2, определяет, что будет пропущена каждая вторая минута. В качестве шага значений также может быть указана звёздочка. Например, значение месяца */3 определяет, что будет пропущен каждый третий месяц.
Любые строки, начинающиеся с символа решетки (#), являются комментариями, и не обрабатываются.
Пример 22-1. Примеры файлов crontab
# record the memory usage of the system every monday # at 3:30AM in the file /tmp/meminfo 30 3 * * mon cat /proc/meminfo >> /tmp/meminfo # run custom script the first day of every month at 4:10AM 10 4 1 * * /root/scripts/backup.sh
Как видно из файла /etc/crontab, в нём используется сценарий run-parts, чтобы запускающий сценарии в каталогах /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly и /etc/cron.monthly соответственно ежечасно, ежедневно, еженедельно и ежемесячно. Файлы в этих каталогах должны быть сценариями оболочки.
Если задачи cron должны выполняться по расписанию, но не ежечасно, ежедневно, еженедельно или ежемесячно, их можно добавить в каталог /etc/cron.d. Все файлы в этом каталоге имеют тот же синтаксис, что и /etc/crontab.
Демон cron каждую минуту ищет изменения в файле etc/crontab и каталогах etc/cron.d/ и /var/spool/cron. Если какие-либо изменения будут найдены, они загружаются в память. Таким образом, демон не нуждается в перезапуске при изменении файла crontab.
Today did a database backup script, incidentally the system has to learn about Linux under the timing of the execution of the script Settings. In Linux, the scheduled execution is performed by adding a custom schedule to the crontab file. The configuration is a little more complicated than in Windows (because there is no graphical interface), but it is not too complicated. The key is to remember the directory /var/spool/cron after using it once.
Today did a database backup script, incidentally the system has to learn about Linux under the timing of the execution of the script Settings. In Linux, the scheduled execution is performed by adding a custom schedule to the crontab file. The configuration is a little more complicated than in Windows (because there is no graphical interface), but it is not too complicated. The key is to remember the directory /var/spool/cron after using it once. Here is a look at the specific use method:
First look at the /etc/crontab file:Copy the code
$ cat /etc/crontab
run-parts
root run-parts /etc/cron.hourly
* root run-parts /etc/cron.daily
0 root run-parts /etc/cron.weekly
42 4 1
root run-parts /etc/cron.monthly
The first four lines are about setting up the environment variables for the CRON task to run. The value of the SHELL variable specifies the SHELL environment used by the system (bash SHELL in this example). The PATH variable defines the PATH for executing commands. The output from Cron is e-mailed to the user name defined by the MAILTO variable. If the MAILTO variable is defined as an empty string (MAILTO=
record the memory usage of the system every monday
at 3:30AM in the file /tmp/meminfo
mon cat /proc/meminfo /tmp/meminfo
Run Custom SCR īpt the first day of every month at 4:10AM
10 4 1
/ root/SCR and PTS/backup. Sh
Users other than root can execute crontab configuration schedule tasks. Crontabs defined by all users are stored in the /var/spool/cron directory, and tasks are executed as creators. To create a crontab for a specific user, log in as the user and run the crontab command
* /home/dbbackup/db1backup.sh backup
* /home/dbbackup/db2backup.sh backup
Said every day at 3 o 'clock to perform/home/dbbackup/db1backup sh backup, perform at 4 / home/dbbackup/db2backup sh backup, if it is once every five minutes to perform can be changed to:Copy the code
* /home/dbbackup/db2backup.sh backup
If the crontab needs to be saved, the crontab will be saved in the following file: /var/spool/cron/username. The file name varies depending on the user name. The cron service checks the changes in the /etc/crontab, /etc/cron.d/, and /var/spool/cron files every minute. If a change is found, it is downloaded to storage. Therefore, even if the crontab file changes, the program does not need to be restarted. Crontab is recommended for user-defined tasks-eD /crond restart command to restart the Crond process. The official file says that you do not need to restart the process, but I encountered a problem that I cannot run the task without restarting the process. At first, I don't know what run-parts means in /etc/crontab file. If I add the command in /etc/crontab format, it always fails. Later, I know that run-parts means directory.Copy the code
Here is another introduction:
/sbin/service crond start // Starts the service
/sbin/service crond stop // Stops the service
/sbin/service crond restart // Restart the service
/sbin/service crond reload // Reloads the configuration
You can also start the service automatically when the system starts:
/sbin/service crond start
1. Run the crontab command to edit the file
For example, if root checks its cron Settings, run crontab -u root -l
For example, root wants to remove Fred’s cron setting: crontab -u Fred -r
When editing the Cron service, there are some formats and conventions for editing content. Enter crontab -u root -e
* ls /tmp/ls.txt
59 minutes (0 -)
Sunday (0-6) //0 stands for Sunday
There are a few special symbols besides numbers"*","/"and"-",",", * represents all the numbers in the value range,"/"Stands for every,"* / 5"For every 5 units,"-"From some number to some number,","Separate a few discrete numbers. Here are a few examples:Copy the code
Every morning at six o ‘clock
Every two hours
Every two hours between 11:00 p.m. and 8:00 a.m., 8:00 a.m
On the 4th of the month and every Monday through Wednesday at 11 a.m
0 11 4 * 1-3 command line
At 4 o ‘clock in the morning on January 1st
0 4 1 1 * command line
After editing the cron Settings of a user, cron automatically generates a file with the same name as the user in /var/spool/cron. The cron information of the user is recorded in this file. This file cannot be edited directly, only crontab can be used-eTo edit. Read this file every hour after cron starts to check if you want to execute the commands inside. Therefore, you do not need to restart the CRon service after modifying the file.Copy the code
2. Edit the /etc/crontab file to configure cron
The cron service not only reads all files in /var/spool/cron once per minute, but also reads /etc/crontab once, so we can configure this file to do something with the cron service. Crontab configuration is specific to a user, while editing /etc/crontab is specific to a system task. The file format for this file is:Copy the code
MAILTO=root // If an error occurs or there is data output, send the data to the account as an email
run-parts
According to hourly accounts, the /etc/cron.hourly scripts are run by user root run-parts
* root run-parts /etc/cron.daily // Run the scripts in /etc/cron.daily every day
0 root run-parts /etc/cron.weekly // Runs the script in /etc/cron.weekly every week
42 4 1
Root run-parts /etc/cron.monthly // Run the scripts in /etc/cron.monthly every month
Notice the «run-parts» parameter. If you remove this parameter, you can write the name of the script you want to run instead of the directory.
You may like:
Запуск и остановка службы
Чтобы запустить службу cron, выполните команду /sbin/service crond start. Чтобы остановить её, выполните команду /sbin/service crond stop. Рекомендуется настроить запуск этой службы при загрузке системы. За подробными инструкциями по настройка автоматического запуска службы cron при загрузке системы обратитесь к главе 20 Управление доступом к службам.
Управление доступом к cron
Для ограничения доступа к cron используются файлы /etc/cron.allow и /etc/cron.deny. Формат списков управления доступом в обоих файлах прост — в каждой строке файла указывается одно имя пользователя. Пробельные символы в этих файлах не допускаются. Перезапускать демон cron (crond) после изменения файлов управления доступом не требуется. Файлы управления доступом обрабатываются каждый раз, когда пользователь пытается добавить или удалить задание cron.
Пользователь root может использовать cron, вне зависимости от того, какие пользователи перечислены в файлах управления доступом.
Если файл cron.allow существует, использовать cron разрешено только перечисленным в нём пользователям, а файл cron.deny игнорируется.
Если cron.allow не существует, пользователям, перечисленным в cron.deny, использовать cron не разрешается.
Anacron
Одна из проблем с Cron заключается в том, что он предполагает, что система работает непрерывно (24 часа в сутки). Это вызывает проблемы для машин, которые не работают весь день (например, персональные компьютеры). Если система отключается в течение запланированного времени выполнения задачи, Cron не будет выполнять эту задачу задним числом.
Anacron не является заменой Cron, но решает эту проблему. Он выполняет команды один раз в день, неделю или месяц, но не поминутно или ежечасно, как это делает Cron. Однако это гарантия того, что задача будет выполнена, даже если система отключится на непредвиденный период времени.
Только root или пользователь с правами администратора может управлять задачами Anacron. Anacron не работает в фоновом режиме, как , а только один раз, выполняя задачи, которые должны быть выполнены.
Anacron использует файл конфигурации (так же, как crontab) с именем anacrontabs
. Этот файл находится в /etc
каталоге.
Содержимое этого файла выглядит следующим образом:
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
/bin/sh
/sbin:/bin:/usr/sbin:/usr/bin
root
# the maximal random delay added to the base delay of the jobs
-22
#period in days delay in minutes job-identifier command
cron.daily run-parts /etc/cron.daily
cron.weekly run-parts /etc/cron.weekly
@monthly cron.monthly run-parts /etc/cron.monthly
В anacrontab
файле мы можем установить частоты только с периодом n
дней, за которым следует время задержки в минутах. Это время задержки просто для того, чтобы убедиться, что задачи не выполняются одновременно.
Третий столбец — это уникальное имя, которое идентифицирует задачу в файлах журнала Anacron.
Четвертый столбец — это фактическая команда для запуска.
Рассмотрим следующую запись:
cron.daily run-parts /etc/cron.daily
Эти задачи выполняются ежедневно, через пять минут после запуска Anacron. Он использует run-parts
для выполнения всех скриптов внутри/etc/cron.daily
.
Вторая запись в списке выше выполняется каждые 7 дней (еженедельно) с задержкой 25 минут.
Столкновение между Cron и Anacron
Как вы, наверное, заметили, Cron также настроен на выполнение скриптов внутри /etc/cron.*
каталогов. Различные варианты Linux обрабатывают такое возможное столкновение с Anacron по-разному. В Ubuntu Cron проверяет, присутствует ли Anacron в системе, и если это так, он не будет выполнять сценарии в /etc/cron.*
каталогах.
В других версиях Linux Cron обновляет временные метки Anacron при выполнении задач. Anacron не будет выполнять их, если Cron уже запустил их.
Запуск и остановка службы
Чтобы запустить службу cron, выполните следующую команду: /sbin/service crond start. Чтобы остановить её, выполните команду: /sbin/service crond stop. Рекомендуется, чтобы эта служба запускалась при загрузке системы. Обратитесь к Главе 8 за указаниями по настройке автоматического запуска службы cron при загрузке системы.
Cron и PHP
Обычно мы запускаем наши скрипты командной строки PHP, используя исполняемый файл PHP.
php script.php
В качестве альтернативы мы можем использовать shebang в начале скрипта и указать на исполняемый файл PHP:
?php
// PHP code here
В результате мы можем выполнить файл, вызвав его по имени. Тем не менее, мы должны убедиться, что у нас есть разрешение на его выполнение.
Чтобы иметь более надежные скрипты командной строки PHP, мы можем использовать сторонние компоненты для создания консольных приложений, таких как Symfony Console Component или Laravel Artisan. Эта статья является хорошим началом для использования консольного компонента Symfony.
Как Cron интерпретирует файлы Crontab
После запуска Cron он выполняет поиск в области катушки, чтобы найти и загрузить файлы crontab в память. Он дополнительно проверяет /etc/crontab
/etc/cron.d
каталоги и или для системных crontabs.
После загрузки crontabs в память Cron проверяет загруженные crontabs поминутно, выполняя события, которые должны быть выполнены.
Кроме того, Cron регулярно (каждую минуту) проверяет, изменилось ли modtime
время изменения каталога spool. Если это так, он проверяет modetime
все загруженные crontabs и перезагружает те, которые изменились. Вот почему нам не нужно перезапускать при установке нового задания cron.
Разрешения Cron
Мы можем указать, какой пользователь должен иметь возможность использовать Cron, а какой нет. Есть два файла, которые играют важную роль, когда дело доходит до разрешений cron: /etc/cron.allow
и /etc/cron.deny
.
Если /etc/cron.allow
существует, то наше имя пользователя должно быть указано в этом файле для использования crontab
. Если /etc/cron.deny
существует, он не должен содержать наше имя пользователя. Если ни один из этих файлов не существует, то на основе параметров конфигурации, зависящих от сайта, либо , либо смогут использовать crontab
команду. Например, в Ubuntu, если ни один файл не существует, все пользователи могут использовать crontab по умолчанию.
Мы можем поместить ALL
/etc/cron.deny
файл, чтобы запретить всем пользователям использовать cron:
ALL /etc/cron.deny
Примечание: Если мы создаем /etc/cron.allow
файл, нет необходимости создавать /etc/cron.deny
файл, поскольку он имеет тот же эффект, что и создание /etc/cron.deny
файла с ALL
в нем.
Настройка заданий cron
Основной файл конфигурации cron, /etc/crontab, содержит следующие строки:
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # run-parts 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly
Первые четыре строки — это переменные, настраивающие окружение, в котором будут работать задачи cron. Переменная SHELL сообщает системе, какую оболочку использовать (в данном примере это оболочка bash), а переменная PATH определяет пути, используемые при выполнении команд. Результат выполнения задач cron будет выслан по электронной почте пользователю, определённому в переменной MAILTO. Если в качестве значения переменной MAILTO задана пустая строка (MAILTO=»»), электронные письма не отправляются. Переменная HOME задаёт домашний каталог, используемый при выполнении команд или сценариев.
Каждая строка в файле /etc/crontab представляет отдельное задание и имеет следующий формат:
minute hour day month dayofweek command
-
minute — любое целое число от 0 до 59
-
hour — любое целое от 0 до 23
-
day — любое целое от 1 до 31 (день должен быть допустимым, если задан месяц)
-
month — любое целое от 1 до 12 (или краткое название месяца, например, jan, feb и т. д.)
-
dayofweek — любое целое от 0 до 7, где 0 или 7 обозначает воскресенье (или краткое название дня недели, например, sun или mon)
-
command — выполняемая команда (это может команда вроде ls /proc >> /tmp/proc или команда, запускающая дополнительный сценарий)
Для любых указанных выше параметров можно использовать звездочку (*), что означает все допустимые значения. Например, если поставить звёздочку в значении месяца, команда будет выполняться каждый месяц в день, определённый другими параметрами.
Дефис (-) между целыми числами обозначает диапазон чисел. Например, 1-4 обозначает набор целых чисел 1, 2, 3 и 4.
Последовательность значений, разделенных запятыми (,), обозначает список. Например, перечисление 3, 4, 6, 8 обозначает четыре указанных целых числа.
Прямая косая черта (/) используется для определения шага значений. Число в диапазоне может быть пропущено, если после диапазона указать /<целое>. Например, значение поля минут 0-59/2, определяет, что будет пропущена каждая вторая минута. В качестве шага значений также может быть указана звёздочка. Например, чтобы запускать задание раз в три месяца, в поле месяца можно использовать значение */3
Любые строки, начинающиеся с символа решетки (#), являются комментариями и не обрабатываются.
Как показывает пример файла /etc/crontab, сценарий run-parts запускает сценарии в каталогах /etc/cron.hourly/, /etc/cron.daily/, /etc/cron.weekly/ и /etc/cron.monthly/ каждый час, день, неделю, месяц соответственно. Файлы в этих каталогах должны быть сценариями оболочки.
Если задание cron нужно выполнить по расписанию, но не ежечасно, ежедневно, еженедельно или ежемесячно, его можно добавить в каталог /etc/cron.d. Все файлы в этом каталоге имеют тот же синтаксис, что и /etc/crontab. Примеры заданий показаны в примере 35-1.
# записывает данные об использовании памяти в системе каждый понедельник # в 3:30 в файл /tmp/meminfo 30 3 * * mon cat /proc/meminfo >> /tmp/meminfo # запускает специальный сценарий каждый день каждого месяца в 4:10 10 4 1 * * /root/scripts/backup.sh
Пример 35-1. Пример заданий crontab
Демон cron проверяет наличие изменений в файле /etc/crontab, каталоге /etc/cron.d/ и каталоге /var/spool/cron/ каждую минуту. Если обнаруживаются какие-либо изменения, они загружаются в память. Таким образом, демон не нуждается в перезапуске при изменении файла crontab.
Перекрытия задач
Бывают случаи, когда запланированные задачи занимают гораздо больше времени, чем ожидалось. Это приведет к перекрытиям, то есть некоторые задачи могут выполняться одновременно. В некоторых случаях это может не вызвать проблемы, но когда они изменяют одни и те же данные в базе данных, у нас возникнет проблема. Мы можем преодолеть это, увеличив частоту выполнения задач. Тем не менее, нет никакой гарантии, что эти перекрытия не повторятся.
У нас есть несколько вариантов предотвращения перекрытия заданий cron.
Использование Flock
Flock — хороший инструмент для управления файлами блокировки из сценариев оболочки или командной строки. Эти файлы блокировки полезны для того, чтобы узнать, запущен ли скрипт.
При использовании совместно с Cron соответствующие задания cron не запускаются, если файл блокировки существует. Вы можете установить Flock, используя apt-get
или yum,
в зависимости от дистрибутива Linux.
flock
yum flock
Рассмотрим следующую запись crontab:
* * * * * /usr/bin/flock --timeout /path/to/cron.lock /usr/bin/php /path/to/scripts.php
В предыдущем примере flock
ищет /path/to/cron.lock
. Если блокировка будет получена за одну секунду, она запустит скрипт. В противном случае он потерпит неудачу с кодом выхода 1.
Использование механизма блокировки в скриптах
Если задание cron выполняет сценарий, мы можем реализовать механизм блокировки в сценарии. Рассмотрим следующий PHP-скрипт:
?php
sys_get_temp_dir md5__FILE__
file_exists ? trimfile_get_contents null
is_null posix_getsid
// Do something here
// And create/update the lock
file_put_contents, getmypid
exit'Another instance of the script is already running.'
В предыдущем коде мы сохраняем pid
текущий PHP-процесс в файле, который находится в системном temp
каталоге. Каждый PHP-скрипт имеет свой собственный файл блокировки, который является MD5-хэшем имени файла скрипта.
Сначала мы проверяем, существует ли файл блокировки, а затем получаем его содержимое, которое является идентификатором процесса последнего запущенного экземпляра скрипта. Затем мы передаем pid
PHP-функцию posix_getsid , которая возвращает идентификатор сеанса процесса. Если posix_getsid
возвращается false
, это означает, что процесс больше не работает, и мы можем безопасно запустить новый экземпляр.
Файлы Crontab
Cron использует специальные файлы конфигурации, называемые crontab
файлами, которые содержат список выполняемых заданий. Crontab означает . Каждая строка в файле crontab называется заданием cron, которое напоминает набор столбцов, разделенных символом пробела. Каждая строка указывает и Cron должен выполнять определенную команду или сценарий.
В файле crontab пустые строки или строки, начинающиеся с #
пробелов или табуляции, будут игнорироваться. Строки, начинающиеся с #, считаются комментариями.
Ниже приведен пример файла crontab с одной записью:
* * * /var/www/sites/db_backup.sh
Первая часть 0 0 * * *
— это выражение cron, которое определяет частоту выполнения. Вышеуказанное задание cron будет выполняться один раз в день.
Пользователи могут иметь свои собственные файлы crontab, названные в честь их имени пользователя, зарегистрированного в /etc/passwd
файле. Все файлы crontab пользовательского уровня находятся в области spool Cron. Вы не должны редактировать эти файлы напрямую. Вместо этого мы должны редактировать их с помощью утилиты crontab
командной строки.
Примечание: Каталог spool варьируется в разных дистрибутивах Linux. На Ubuntu это /var/spool/cron/crontabs
в то время как в CentOS это /var/spool/cron
.
Чтобы отредактировать наш файл crontab:
-e
Приведенная выше команда автоматически откроет файл crontab, принадлежащий нашему пользователю. Если вы еще не выбрали редактор по умолчанию для crontab, вы увидите набор установленных редакторов для выбора. Мы также можем явно выбрать или изменить нужный нам редактор для редактирования файла crontab:
nano -e
После сохранения файла и выхода из редактора crontab будет проверен на точность. Если все настроено правильно, файл будет сохранен в каталоге spool.
Каждая команда в файле crontab выполняется с точки зрения пользователя, которому принадлежит crontab. Если ваша команда выполняется как root (sudo), вы не сможете определить этот crontab из своей учетной записи пользователя, если вы не войдете в систему как root.
Список установленных cron jobs, принадлежащих нашему пользователю:
-l
Мы также можем записать наши задания cron в файл и отправить его содержимое в файл crontab следующим образом:
/path/to/the/file/containing/cronjobs.txt
Предыдущая команда перезапишет существующий файл crontab /path/to/the/file/containing/cronjobs.txt
.
Чтобы удалить crontab, мы используем -r
опцию:
-r
Анатомия записи Crontab
Анатомия записи crontab на уровне пользователя выглядит следующим образом:
# ┌───────────── min (0 - 59)
# │ ┌────────────── hour (0 - 23)
# │ │ ┌─────────────── day of month (1 - 31)
# │ │ │ ┌──────────────── month (1 - 12)
# │ │ │ │ ┌───────────────── day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * command to execute
В первых двух полях указывается время ( и ), в которое будет выполняться задача. Следующие два поля указывают и . Пятое поле указывает .
Cron выполнит команду, когда минута, час, месяц и или совпадут с текущим временем.
Если и имеют определенные значения, событие будет выполняться, когда поле соответствует текущему времени. Рассмотрим следующее выражение:
-20/5 Feb /path/to/command
Предыдущее задание cron будет выполняться один раз в день каждые пять дней, с 5 по 20 февраля все вторники февраля.
Важно: Когда и день месяца, и день недели имеют определенные значения (не звездочку), он создаст OR
условие, то есть оба дня будут совпадать.
Синтаксис в system crontabs (/etc/crontab
) немного отличается от crontabs пользовательского уровня. Разница в том, что шестое поле — это команда, а , от имени которого мы хотим запустить задание.
* * * * * testuser /path/to/command
Не рекомендуется помещать общесистемные задания cron /etc/crontab
, так как этот файл может быть изменен в будущих обновлениях системы. Вместо этого мы помещаем эти задания cron в /etc/cron.d
каталог.
Редактирование Crontab других пользователей
Возможно, нам придется редактировать файлы crontab других пользователей. Для этого мы используем -u
опцию, как показано ниже:
-u username -e
Примечание Мы можем редактировать файлы crontab других пользователей только как пользователь root или как пользователь с правами администратора.
Некоторые задачи требуют прав администратора. Вы должны добавить их в файл crontab корневого пользователя:
-e
Обратите внимание, что использование sudo
with crontab -e
будет редактировать файл crontab корневого пользователя. Если нам нужно отредактировать crontab другого пользователя во время использования sudo
, мы должны использовать -u
опцию для указания владельца crontab.
Стандартные и нестандартные значения Crontab
Поля Crontab принимают числа в качестве значений. Однако мы можем поместить в эти поля и другие структуры данных.
Диапазоны
Мы можем передавать диапазоны чисел:
-18 -15 * * /path/to/command
Вышеуказанное задание cron будет выполняться с 6 утра до 6 вечера с 1-го по 15-е число каждого месяца в году. Обратите внимание, что указанный диапазон включен, поэтому 1-5 означает 1,2,3,4,5.
Списки
Список — это группа значений, разделенных запятыми. Мы можем иметь списки в качестве значений полей:
,5,7 * * * /path/to/command
Приведенный выше синтаксис будет запускать задание cron в 1 am, 4 am, 5 am и 7 am каждый день.
Шаги
Шаги можно использовать с диапазонами или символом звездочки(*)
. Когда они используются с диапазонами, они указывают количество значений, которые нужно через конец диапазона. Они определяются «/"
символом после диапазона, за которым следует число. Рассмотрим следующий синтаксис:
-18/2 * * * /path/to/command
Вышеуказанное задание cron будет выполняться каждые два часа с 6 утра до 6 вечера.
Когда шаги используются со звездочкой, они просто указывают частоту этого конкретного поля. Например, если мы устанавливаем минуту*/5
, это просто означает каждые пять минут.
Мы можем комбинировать списки, диапазоны и шаги вместе, чтобы иметь более гибкое планирование событий:
-10/5,14,15,18-23/3 * /path/to/command
Вышеуказанное событие будет проходить каждые пять часов с полуночи 1 января до 10 утра, 2 вечера, 3 вечера, а также каждые три часа с 6 вечера до 11 вечера.
Имена
Для полей и мы можем использовать первые три буквы определенного дня или месяца, например Sat
, sun
, Feb
, Sep
, и т.д.
* * * Feb,mar sat,sun /path/to/command
Предыдущее задание cron будет выполняться только по субботам и воскресеньям февраля и марта.
Обратите внимание, что имена чувствительны к регистру. Диапазоны не допускаются при использовании имен.
Предопределенные определения
Некоторые реализации cron могут поддерживать некоторые специальные строки. Эти строки используются вместо первых пяти полей, каждое из которых определяет определенную частоту:
- annual Запуск один раз в год в полночь 1 января
(0 0 1 1 *)
- запуск один раз в месяц, в полночь первого дня месяца
(0 0 1 * *)
- запуск один раз в неделю в полночь воскресенья
(0 0 * * 0)
- запуск один раз в день в полночь
(0 0 * * *)
- запуск в начале каждого часа
(0 * * * *)
- Запуск один раз при запуске
Несколько команд в одном задании Cron
Мы можем выполнить несколько команд в одном задании cron, разделив их точкой с запятой (;
).
* * * * * /path/to/command-1 /path/to/command-2
Если выполняемые команды зависят друг от друга, мы можем использовать двойной амперсанд (&&)
между ними. В результате вторая команда не будет выполняться, если первая не выполняется.
* * * * * /path/to/command-1 /path/to/command-2
Переменные среды
Переменные среды в файлах crontab имеют форму VARIABLE_NAME = VALUE
(пробелы вокруг знака равенства необязательны). Cron не создает никаких файлов запуска из домашнего каталога пользователя (когда он работает на уровне пользователя cron). Это означает, что мы должны вручную установить любые пользовательские настройки, требуемые нашими задачами.
Cron автоматически устанавливает некоторые переменные среды при запуске. HOME
и LOGNAME
устанавливаются из информации владельца crontab /etc/passwd
в. Однако мы можем переопределить эти значения в нашем файле crontab, если в этом есть необходимость.
Есть также еще несколько переменных, например SHELL
, указывающих оболочку, которая выполняет команды. Это /bin/sh
по умолчанию. Мы также можем установить PATH
, в котором искать программы.
/usr/bin/usr/local/bin
Важно: мы должны заключать значение в кавычки, когда в значении есть пробел. Обратите внимание, что значения являются обычными строками. Они не будут интерпретироваться или анализироваться каким-либо образом.
Разные часовые пояса
Cron использует настройку часового пояса системы при оценке записей crontab. Это может вызвать проблемы для многопользовательских систем с пользователями, базирующимися в разных часовых поясах. Чтобы обойти эту проблему, мы можем добавить переменную среды с именем CRON_TZ
в наш файл crontab. В результате все записи crontab будут проанализированы на основе указанного часового пояса.
Быстрое устранение неполадок
Абсолютный путь к командам
Это хорошая привычка использовать абсолютные пути ко всем исполняемым файлам, которые мы используем в файле crontab.
* * * * * /usr/local/bin/php /absolute/path/to/the/command
Убедитесь, что cron запущен
Если наши задачи вообще не выполняются, сначала нам нужно убедиться, что Cron запущен:
aux crond
Вывод должен быть похож на этот:
root ? Ss :49 crond
Проверка /etc/cron.allow
и /etc/cron.deny
файлы
Когда задания cron не выполняются, нам нужно проверить /etc/cron.allow
, существует ли. Если это так, нам нужно убедиться, что мы перечислили наше имя пользователя в этом файле. И если /etc/cron.deny
существует, нам нужно убедиться, что наше имя пользователя не указано в этом файле.
Если мы редактируем файл crontab пользователя, в то время как пользователь не существует в /etc/cron.allow
файле, включая пользователя в /etc/cron.allow
не будет запускать cron, пока мы не отредактируем файл crontab.
Разрешение на выполнение
Мы должны убедиться, что владелец crontab имеет разрешения на выполнение для всех команд и сценариев в файле crontab. В противном случае cron не будет работать. Вы можете добавить разрешения на выполнение в любую папку или файл с помощью:
+x /some/file.php
Новый символ строки
Каждая запись в crontab должна заканчиваться новой строкой. Это означает, что после последней записи crontab должна быть пустая строка, иначе последнее задание cron никогда не будет выполнено.
Терминология Cron Job
- Job: единица работы, серия шагов, чтобы что-то сделать. Например, отправка электронной почты группе пользователей. В этой статье будет использоваться задачазаданиеcron или событие взаимозаменяемо.
- Daemon: компьютерная программа, которая работает в фоновом режиме, служа различным целям. часто запускаются во время загрузки. Веб-сервер — это демон, обслуживающий HTTP-запросы. Cron — это для выполнения запланированных задач.
- Cron Job: задание cron — это запланированное задание задание, когда оно должно быть выполнено.
- Webcron планировщик заданий на основе времени, который работает в серверной среде. Это альтернатива стандартному Cron, часто на общих веб-хостах, которые не предоставляют доступ к оболочке.
Завершение
Cron — это , выполняющий список событий, запланированных на будущее. Мы определяем эти задания в специальных файлах конфигурации, называемых файлами crontab. Пользователи могут иметь свой собственный файл crontab, если им разрешено использовать Cron на основе /etc/cron.allow
или /etc/cron.deny files
. В дополнение к заданиям cron на уровне пользователя Cron также загружает общесистемные задания cron, которые немного отличаются по синтаксису.
Наши задачи обычно PHP скрипты или утилиты командной строки. В системах, которые не работают все время, мы можем использовать Anacron для запуска событий, которые происходят в течение n
нескольких дней.
При работе с Cron мы также должны знать о задачах, перекрывающих друг друга, чтобы предотвратить потерю данных. После завершения задания cron выходные данные будут отправлены владельцу crontab и/или электронной почты, указанной в переменной MAILTO
среды.
Перенаправление вывода
Мы можем перенаправить вывод нашего задания cron в файл, если команда (или скрипт) имеет какой-либо вывод:
* * * * * /path/to/php /path/to/the/command /var/log/cron.log
Мы можем перенаправить стандартный вывод на dev null, чтобы не получить электронное письмо, но все же отправить стандартное сообщение об ошибке:
* * * * * /path/to/php /path/to/the/command /dev/null
Чтобы запретить Cron отправлять нам какие-либо электронные письма, мы меняем соответствующую запись crontab, как показано ниже:
* * * * * /path/to/php /path/to/the/command /dev/null
Это означает “отправить как стандартный вывод, так и вывод ошибки в забвение”.
Отправьте вывод по электронной почте
Выходные данные отправляются по почте владельцу crontab или электронной почте (адресам), указанным в переменной MAILTO
среды (если стандартный вывод или стандартная ошибка не перенаправляются, как указано выше).
Если MAILTO
установлено значение empty, в результате выполнения задания cron электронное письмо отправлено не будет.
Мы можем установить несколько писем, разделив их запятыми:
admin@example.com,dev@example.com
* * * * * /path/to/command