Thank you for reading this post, don't forget to subscribe!
Разница между Cron, Crontab и Cron Job
Визуальный взгляд на вещи помогает быстрее понять новые темы. Вот разбивка того, как эти три темы обычно взаимодействуют. Затем я опишу каждый более подробно.
Элемент | Имя Linux | Смысл |
---|---|---|
Daemon (Демон) | ‘crond’ | Произносится «demon» или «day-mon». Это фоновые системные процессы Linux. |
Table (Таблица) | ‘crontab’ | Вы записываете строки в эту таблицу при вводе команды crontab. Каждая звездочка «*» представляет отрезок времени и соответствующий столбец в каждой строке. |
Job (Задача) | Cron Job | Конкретная задача, которая должна быть выполнена, описана в строке в сочетании с назначенным ей идентификатором времени |
Таблица Cron
Crontab означает Cron Table. Это системный файл Linux, который создает табличную структуру, в которой поля разделяются пробелами. Пользователи могут заполнять таблицу, присваивая значения каждому полю (звездочка).
Если это поможет, вы можете думать о вашем crontab как о мини-базе данных.
Cron Job
Если вы не знакомы с базами данных, вы можете представить ячейки в пустом файле Excel. В любом случае, для этой аналогии каждая звездочка представляет столбец, значение которого определяется его заголовком. Последний столбец будет вызовом команды или сценария. Каждый полный ряд можно рассматривать как отдельную работу. Их часто называют “cron jobs”, хотя работа, задание и т. д. Являются взаимозаменяемыми терминами.
Демон Cron
Мы уже обсуждали таблицу и как мы заполняем ее рабочими местами. Но как эти работы выполняются? Системный процесс под названием Daemon выполняется на фоне нашего Linux-компьютера.
Есть демоны для разных сервисов. Обычно они называются суффиксом «d» к имени службы.
Естественно, демон cron называется «crond». С нашей стороны не требуется никаких действий для запуска этого демона, но если вы считаете, что команда не работает должным образом, вы можете использовать команду ps, чтобы убедиться, что crond запущен.
1 |
ps aux | grep crond |
Эта команда будет искать текущие процессы для всех пользователей и возвращать любые экземпляры ‘crond’.
1 2 |
andreyex@destroyer:~$ ps ux | grep crond andrey+ 4352 0.0 0.0 18612 840 pts/0 S+ 02:16 0:00 grep --color=auto crond |
Мы видим, что демон запущен для нашей учетной записи.
Понимание синтаксиса Crontab
Теперь, когда у вас есть смутное представление о том, как работает cron, давайте посмотрим на синтаксис использования crontab. Мы надеемся, что это менее запутанно, если вы можете представить эту информацию в виде таблицы в вашем уме.
1 2 3 4 5 |
crontab [options] * * * * * <command> OR * * * * * <path/to/script> |
Мы обещаем, что это произойдет, потому что для вас, как только мы приведем в действие наш собственный пример. Давайте снова рассмотрим синтаксис для заданий cron.
Как видите, синтаксис crontab состоит из 5 звездочек. Вот что представляет каждая из этих звездочек:
первая | вторая | третья | четвёртая | пятая | |
---|---|---|---|---|---|
* | * | * | * | * | |
ID | Минуты | Часы | День | Месяц | Название дня |
Values | 0-59 | 0 -23 | 1-31 | 1-12 | 0-6 |
Чтобы запланировать задачу, вы заменяете соответствующую звездочку на желаемое значение.
Давайте немного потренируемся. Если у вас есть crontab, подобный приведенному ниже, как вы думаете, когда работа будет запущена?
1 |
0 0 * * 0 |
Вопрос: Когда команда будет запущена, если вы зададите задание таким образом?
A. Каждый час с понедельника по субботу
B. Каждая минута по воскресеньям
C. Только в полночь с понедельника по субботу
D. Только в полночь по воскресеньям
Ответ здесь . Выполнять «команду» в 00:00 [полночь] каждое воскресенье.
Настройте доступ crontab для вашей учетной записи пользователя
Crontab зависит от пользователя. Вы уже затронули это немного. Если вы думаете, что вы уже использовали crontab, вы можете проверить это с помощью crontab -l .
1 2 3 4 5 6 7 8 9 10 11 12 |
andreyex@destroyer:~$ crontab -l no crontab for andreyex andreyex@destroyer:~$ crontab -e no crontab for andreyex - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/nano <---- easiest 2. /usr/bin/code 3. /bin/ed Choose 1-3 [1]: 1 |
Когда мы запускаем эту команду, вы видите, что у нас нет crontab в этой системе.
Поскольку мы еще не создали crontab, когда используем -e для редактирования таблицы, он запрашивает наш предпочтительный текстовый редактор. Nano предлагается в качестве самой простой в использовании программы. Вы можете использовать любой текстовый редактор командной строки, например Vim или Emacs. Это действительно зависит от вас.
Если сначала не получится, sudo
Если вы попытаетесь выполнить команду crontab -e, но не получите этот результат, у вас могут не быть привилегий пользователя для создания таблицы. Если у вас есть доступ к sudo, вы можете использовать sudo для установки crontab.
1 |
sudo crontab -e <your_username> |
Ваша система автоматически загрузит ваш crontab в нужное место, которое может варьироваться в зависимости от дистрибутива, но часто находится в каталоге, таком как /var/spool/cron/crontabs. Не пытайтесь редактировать файлы здесь.
Что произойдет, если задание cron обнаружит ошибку?
Поведение по умолчанию – отправлять по электронной почте свой вывод. Эта функция предназначена для администраторов, которые могут автоматически отправлять журналы на «локальную» электронную почту в домене сети.
Вы можете настроить это самостоятельно, если у вас есть почтовый сервер. Существуют также способы автоматизации вывода электронной почты в GMail или аналогичные сервисы. Тем не менее, эти методы выходят за рамки данной статьи.
Вместо этого мы рассмотрим два распространенных способа обойти ошибку.
1) Отправить вывод в файл
Вы можете назначить файл для этого типа вывода для отправки, а затем использовать >> для перенаправления вывода.
Использование >>добавит информацию в существующий файл, в то время как один символ > перезапишет файл. Это важно знать, если вы хотите поддерживать большой файл журнала, который часто обновляет записи. Оба автоматически создадут файл, если он не существует.
Пример работы Cron:
1 |
0 * * * * echo "Linux это круто!" >> ~/crontab_log.txt |
2) Используйте /dev/null
Это обойдёт опцию электронной почты, по сути удалив данные. Стандартная ошибка (‘2’) и стандартный вывод (‘1’) отправляются в нулевой файл.
1 |
0 0 * * * echo "Why are you silencing me every night at midnight?" > /dev/null 2>&1 |
Вы могли заметить, что мы используем команду echo для примеров. Для этого нет особой причины, но она позволяет легко проверять изменения и «проверять свою работу».
Если вы немного программировали, возможно, вы использовали команду print для проверки вашей логики. Это та же концепция.
Давайте попробуем создать нашу собственную работу cron. Если вы уже «подыгрываете», это здорово. Если нет, то сейчас самое время подготовить этот терминал и повеселиться.
Примеры Crontab: планирование команд и скриптов
Мы показали вам пару примеров, как выводится информация. Это имело для вас смысл?
Позвольте пройти первый пример.
Minute | Hour | Day-Date | Month | Day Name | Command
|—–|——|—–|—–|—–|—–|—–|
| 0 | * | * | * | * | echo “Linux is Cool!” >> ~/crontab_log.txt |
Установка минутного значения в «0» означает, что команда будет выполняться каждый час в час.
Расширенные графики работы
Вы можете редактировать несколько значений одновременно. Если вы хотите, вы можете заменить все 5 звездочек со спецификациями.
Minute | Hour | Day-Date | Month | Day Name | Command
|—–|——|—–|—–|—–|—–|—–|
|*/5 | 3-6 | */5 | */2 |0,6| echo “Linux is Cool!” >> ~/crontab_log.txt |
Есть идеи, что говорит этот? Ради этого урока мы сделал эту работу особенно запутанной. Было бы необычно иметь что-то с таким большим количеством параметров «в дикой природе», но давайте посмотрим, сможете ли вы расшифровать это.
Давайте попробуем это вместе:
поле | Ценность | Смысл |
---|---|---|
Day Name | 0,6 | Суббота и воскресенье |
Month | * / 2 | Каждый месяц, который делится на 2, месяц. |
Day Date | * | Каждый день |
Hour | 3-6 | С 3 до 6 утра |
Minutes | * / 5 | Каждые 5 минут |
На простом языке:
1 |
Таким образом, каждый второй месяц, по выходным, независимо от даты, эта команда будет выполняться каждые 5 минут между 3 утра и 6 утра. |
Вау, это было запутанно. Если вы смогли следовать этому, вы готовы справиться с лучшими из них.
Напишите простой скрипт автоматизации cron для резервного копирования файлов.
До этого момента написанные вами задания cron делали только одно. Это может быть полезно, но, возможно, вы хотите сделать несколько задач.
К счастью, это не только возможно, но и очень просто. Если вы помните из исходного примера синтаксиса, вы также можете использовать путь к сценарию.
Это не ограничивается только bash, вы также можете реализовать скрипт, который использует Python или Perl, если хотите.
Каковы наши цели?
- Работа будет обрабатываться в 3 часа ночи каждую ночь
- Резервное копирование папку /Documents в zip-файл
- Создайте текстовый файл со списком всего в каталоге
- Создайте архивную папку, которая клонирует нашу резервную копию и текстовый файл в подпапку с текущей датой
our_backup_script.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#! /bin/bash DATE=$(date +%d-%m-%Y) # Date in format DAY##-MONTH##-YEAR#### mkdir -p ~/archive/$DATE # создайте папку для сегодняшней даты в архиве, если архив не существует, сделайте архив ls -al ~/Documents > ~/archive/$DATE/contents.txt # создайте текстовый файл со списком содержимого папки документы cd ~/ && tar -cpzf $DATE.docs.backup.gz Documents/* # перейдите в родительский каталог в папку tar / Documents cp ~/$DATE.docs.backup.gz ~/archive/$DATE/documents_archive.gz # один файл .gz остается в домашнем каталоге, дубликат отправляется в наш архив под его датой |
1 2 3 4 5 6 7 8 9 10 |
andreyex@destroyer:~$ ls Desktop Downloads Music Pictures Public Videos Documents ENV our_backup_script.sh projects Templates 'VirtualBox VMs' andreyex@destroyer:~$ bash our_backup_script.sh andreyex@destroyer:~$ ls 25-11-2019.docs.backup.gz Documents Music projects Videos archive Downloads our_backup_script.sh Public 'VirtualBox VMs' Desktop ENV Pictures Templates andreyex@destroyer:~$ ls archive/25-11-2019/ contents.all_files.txt documents_archive.gz |
Все, что осталось сделать, сделать этот скрипт работой cron.
1 |
crontab -e |
И добавьте туда следующее:
1 |
0 3 * * * bash ~/our_backup_script.sh |
На самом деле, идея очень понравилась, мы могли бы просто сохранить это как ежедневную резервную копию. Одна из модификаций, которую мы сделали, – это переместить архив в папку на нашу машине, которая синхронизируется с облачным хранилищем.