Crontab используется для автоматизации всех типов задач в системах Linux. Это особенно важный навык для начинающих системных администраторов. Это может быть довольно сложно начать, если вы новичок. Синтаксис отличается от большинства других команд. По этой причине эта статья будет содержать немного дополнительной справочной информации, прежде чем мы покажем вам некоторые из применений.
Не пугайтесь crontab
Для нас Crontab был одной из самых пугающих концепций Linux как новичок. В то время, когда мы познакомились с ‘crontab’, мы использовали командную строку всего несколько дней и почти не понимали, как использовать основные команды навигации по файлам, такие как ‘ls’ и ‘cd’.
Причина, по которой мы приводим свою личную историю обучения, заключается в том, что многие новые пользователи Linux могут испытывать такое же поражение, когда смотрят на уникальный синтаксис «crontab». Мы можем заверить вас, хотя, это не так сложно, когда вы понимаете, как это работает.
Мы кратко расскажем о некоторых концепциях, связанных с crontab, чтобы облегчить понимание. Наша цель – контекстуализировать эти понятия и проиллюстрировать, как они связаны друг с другом.
Позвольте сначала познакомить вас с некоторой базовой концепцией «cron».
Визуальный взгляд на вещи помогает быстрее понять новые темы. Вот разбивка того, как эти три темы обычно взаимодействуют. Затем я опишу каждый более подробно.
Элемент | Имя Linux | Смысл |
---|---|---|
Daemon (Демон) | ‘crond’ | Произносится «demon» или «day-mon». Это фоновые системные процессы Linux. |
Table (Таблица) | ‘crontab’ | Вы записываете строки в эту таблицу при вводе команды crontab. Каждая звездочка «*» представляет отрезок времени и соответствующий столбец в каждой строке. |
Job (Задача) | Cron Job | Конкретная задача, которая должна быть выполнена, описана в строке в сочетании с назначенным ей идентификатором времени |
Crontab означает Cron Table. Это системный файл Linux, который создает табличную структуру, в которой поля разделяются пробелами. Пользователи могут заполнять таблицу, присваивая значения каждому полю (звездочка).
Если это поможет, вы можете думать о вашем crontab как о мини-базе данных.
Если вы не знакомы с базами данных, вы можете представить ячейки в пустом файле Excel. В любом случае, для этой аналогии каждая звездочка представляет столбец, значение которого определяется его заголовком. Последний столбец будет вызовом команды или сценария. Каждый полный ряд можно рассматривать как отдельную работу. Их часто называют “cron jobs”, хотя работа, задание и т. д. Являются взаимозаменяемыми терминами.
Мы уже обсуждали таблицу и как мы заполняем ее рабочими местами. Но как эти работы выполняются? Системный процесс под названием Daemon выполняется на фоне нашего Linux-компьютера.
Есть демоны для разных сервисов. Обычно они называются суффиксом «d» к имени службы.
Естественно, демон cron называется «crond». С нашей стороны не требуется никаких действий для запуска этого демона, но если вы считаете, что команда не работает должным образом, вы можете использовать команду ps, чтобы убедиться, что crond запущен.
ps aux | grep crond
Эта команда будет искать текущие процессы для всех пользователей и возвращать любые экземпляры ‘crond’.
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
Мы видим, что демон запущен для нашей учетной записи.
Теперь, когда у вас есть смутное представление о том, как работает cron, давайте посмотрим на синтаксис использования crontab. Мы надеемся, что это менее запутанно, если вы можете представить эту информацию в виде таблицы в вашем уме.
crontab [options] * * * * * <command> OR * * * * * <path/to/script>
Мы обещаем, что это произойдет, потому что для вас, как только мы приведем в действие наш собственный пример. Давайте снова рассмотрим синтаксис для заданий cron.
Как видите, синтаксис crontab состоит из 5 звездочек. Вот что представляет каждая из этих звездочек:
первая | вторая | третья | четвёртая | пятая | |
---|---|---|---|---|---|
* | * | * | * | * | |
ID | Минуты | Часы | День | Месяц | Название дня |
Values | 0-59 | 0 -23 | 1-31 | 1-12 | 0-6 |
Чтобы запланировать задачу, вы заменяете соответствующую звездочку на желаемое значение.
Давайте немного потренируемся. Если у вас есть crontab, подобный приведенному ниже, как вы думаете, когда работа будет запущена?
0 0 * * 0
Вопрос: Когда команда будет запущена, если вы зададите задание таким образом?
A. Каждый час с понедельника по субботу
B. Каждая минута по воскресеньям
C. Только в полночь с понедельника по субботу
D. Только в полночь по воскресеньям
Ответ здесь . Выполнять «команду» в 00:00 [полночь] каждое воскресенье.
Crontab зависит от пользователя. Вы уже затронули это немного. Если вы думаете, что вы уже использовали crontab, вы можете проверить это с помощью crontab -l .
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. Это действительно зависит от вас.
Если вы попытаетесь выполнить команду crontab -e, но не получите этот результат, у вас могут не быть привилегий пользователя для создания таблицы. Если у вас есть доступ к sudo, вы можете использовать sudo для установки crontab.
sudo crontab -e <your_username>
Ваша система автоматически загрузит ваш crontab в нужное место, которое может варьироваться в зависимости от дистрибутива, но часто находится в каталоге, таком как /var/spool/cron/crontabs. Не пытайтесь редактировать файлы здесь.
Поведение по умолчанию – отправлять по электронной почте свой вывод. Эта функция предназначена для администраторов, которые могут автоматически отправлять журналы на «локальную» электронную почту в домене сети.
Вы можете настроить это самостоятельно, если у вас есть почтовый сервер. Существуют также способы автоматизации вывода электронной почты в GMail или аналогичные сервисы. Тем не менее, эти методы выходят за рамки данной статьи.
Вместо этого мы рассмотрим два распространенных способа обойти ошибку.
Вы можете назначить файл для этого типа вывода для отправки, а затем использовать >> для перенаправления вывода.
Использование >>добавит информацию в существующий файл, в то время как один символ > перезапишет файл. Это важно знать, если вы хотите поддерживать большой файл журнала, который часто обновляет записи. Оба автоматически создадут файл, если он не существует.
Пример работы Cron:
0 * * * * echo "Linux это круто!" >> ~/crontab_log.txt
Это обойдёт опцию электронной почты, по сути удалив данные. Стандартная ошибка (‘2’) и стандартный вывод (‘1’) отправляются в нулевой файл.
0 0 * * * echo "Why are you silencing me every night at midnight?" > /dev/null 2>&1
Вы могли заметить, что мы используем команду echo для примеров. Для этого нет особой причины, но она позволяет легко проверять изменения и «проверять свою работу».
Если вы немного программировали, возможно, вы использовали команду print для проверки вашей логики. Это та же концепция.
Давайте попробуем создать нашу собственную работу cron. Если вы уже «подыгрываете», это здорово. Если нет, то сейчас самое время подготовить этот терминал и повеселиться.
Мы показали вам пару примеров, как выводится информация. Это имело для вас смысл?
Позвольте пройти первый пример.
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 минут |
На простом языке:
Таким образом, каждый второй месяц, по выходным, независимо от даты, эта команда будет выполняться каждые 5 минут между 3 утра и 6 утра.
Вау, это было запутанно. Если вы смогли следовать этому, вы готовы справиться с лучшими из них.
До этого момента написанные вами задания cron делали только одно. Это может быть полезно, но, возможно, вы хотите сделать несколько задач.
К счастью, это не только возможно, но и очень просто. Если вы помните из исходного примера синтаксиса, вы также можете использовать путь к сценарию.
Это не ограничивается только bash, вы также можете реализовать скрипт, который использует Python или Perl, если хотите.
Каковы наши цели?
our_backup_script.sh
#! /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 остается в домашнем каталоге, дубликат отправляется в наш архив под его датой
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.
crontab -e
И добавьте туда следующее:
0 3 * * * bash ~/our_backup_script.sh
На самом деле, идея очень понравилась, мы могли бы просто сохранить это как ежедневную резервную копию. Одна из модификаций, которую мы сделали, – это переместить архив в папку на нашу машине, которая синхронизируется с облачным хранилищем.
У вас есть идеи для сценария, который вы можете создать? Помогла ли вам эта статья лучше понять crontab? Поделитесь с нами в комментариях.
sadasd