Объяснение Crontab в Linux [с примерами]
Изучите концепцию crontab в Linux. Узнайте, как настроить задания cron для автоматического запуска сценариев и команд в заранее определенное время.
crontab используется для автоматизации всех типов задач в системах Linux. Это особенно важный навык для начинающих системных администраторов. Если вы новичок, начать работу может быть довольно сложно. Синтаксис отличается от большинства других команд. По этой причине этот урок будет включать немного больше вводной информации, прежде чем я покажу вам некоторые варианты использования.
Не пугайтесь crontab
Для меня, как для новичка, Crontab был одной из самых устрашающих концепций Linux. В то время, когда я познакомился с «crontab», я пользовался командной строкой всего несколько дней и едва понимал, как использовать основные команды навигации по файлам, такие как «ls» и «cd».
Причина, по которой я рассказываю о своей личной истории обучения, заключается в том, что я ожидаю, что многие новые пользователи Linux могут почувствовать себя такими же ошеломленными, когда увидят уникальный синтаксис «crontab». Однако могу вас заверить: это не так уж и сложно, если вы поймете, как это работает.
Что вы узнаете из этого руководства
Я хочу кратко представить некоторые концепции, связанные с crontab, чтобы их было легче понять. Моя цель — контекстуализировать эти концепции и проиллюстрировать, как они связаны друг с другом.
Краткое введение в концепции Cron
Настройте доступ к Crontab для вашей учетной записи пользователя
Обрабатывайте ошибки с помощью cronjobs
Создание заданий cron
Краткое введение в ключевые концепции cron
Позвольте мне сначала познакомить вас с базовой концепцией cron.
Разница между Cron, Crontab и Cron Job
Визуальный просмотр помогает быстрее понять новые темы. Вот разбивка того, как эти три темы обычно взаимодействуют. Затем я опишу каждый более подробно.
Element | Linux Name | Meaning |
---|---|---|
Daemon | ‘crond’ | Pronounced “demon” or “day-mon”. These are Linux background system processes. |
Table | ‘crontab’ | You write rows to this table when entering a crontab command. Each ‘*’ asterisk represents a segment of time and a corresponding column in each row. |
Job | Cron Job | The specific task to be performed described in a row, paired with its designated time id |
Таблица Крон
Crontab означает Cron Table. Это системный файл Linux, который создает структуру, подобную таблице, где поля разделены пробелами. Пользователи могут заполнять таблицу, присваивая значения каждому полю (звездочка).
На протяжении всей статьи я мог бы использовать разные языки для описания этой идеи. Чтобы внести ясность, поле, ячейка, столбец и т. д. относятся к одному и тому же. Если это поможет, вы можете думать о своем crontab как о мини-базе данных.
Задача Крон
Если вы не знакомы с базами данных, вы можете представить себе ячейки в пустом файле Excel. В любом случае, в этой аналогии каждая звездочка представляет столбец, значение которого определяется его заголовком. Последний столбец будет содержать вызов команды или сценария. Каждый полный ряд можно рассматривать как отдельную работу. Их часто называют «заданиями cron», хотя задание, задача и т. д. являются взаимозаменяемыми терминами.
Демон Крон
Мы уже обсуждали таблицу и то, как мы заполняем ее вакансиями. Но как выполняются эти задания? Системный процесс, называемый демоном, работает в фоновом режиме на нашей машине с Linux.
Существуют демоны для множества различных сервисов. Обычно они называются путем добавления к имени службы суффикса «d».
Естественно, демон cron называется «crond». Для запуска этого демона с нашей стороны не требуется никаких действий, но если вы считаете, что команда работает неправильно, вы можете использовать команду ps, чтобы убедиться, что «crond» запущен.
ps aux | grep crond
Эта команда выполнит поиск текущих процессов для всех пользователей и вернет все экземпляры «crond».
christopher@pop-os:~$ ps ux | grep crond
christo+ 8942 0.0 0.0 18612 840 pts/0 S+ 02:16 0:00 grep --color=auto crond
Я вижу, что демон работает для моей учетной записи пользователя. Я уже знал это, потому что целый день заполнял файл выводом.
Понимание синтаксиса Crontab
Теперь, когда у вас есть смутное представление о том, как работает cron, давайте посмотрим на синтаксис использования crontab. Я надеюсь, что это будет менее запутанно, если вы сможете представить эту информацию в виде таблицы в уме.
crontab [options]
* * * * * <command>
OR
* * * * * <path/to/script>
Я обещаю, что это поможет вам, как только мы запустим и заработаем наш собственный пример. Давайте еще раз рассмотрим синтаксис заданий cron.
Как видите, синтаксис crontab имеет 5 звездочек. Вот что означает каждая из этих звездочек:
1st | 2nd | 3rd | 4th | 5th | |
---|---|---|---|---|---|
* | * | * | * | * | |
ID | Minute | Hour | Day-Date | Month | Day Name |
Values | 0-59 | 0 -23 | 1-31 | 1-12 | 0-6 |
ПРИМЕЧАНИЕ. Названия дней 0–6 начинаются с воскресенья.
Чтобы запланировать задачу, замените соответствующую звездочку желаемым значением.
Давайте применим это к небольшой практике. Если у вас есть crontab, подобный показанному ниже, как вы думаете, когда задание будет запущено?
0 0 * * 0
Вопрос: Когда будет выполнена команда, если вы настроите задание таким образом?
А. Каждый час с понедельника по субботу
Б. Каждую минуту по воскресеньям
C. Только в полночь с понедельника по субботу
Д. Только в полночь по воскресеньям
Ответ здесь: D. Запускайте «команду» в 00:00 [полночь] каждое воскресенье.
Настройте доступ crontab для вашей учетной записи пользователя
Crontab зависит от пользователя. Вы уже немного этого коснулись. Если вы считаете, что, возможно, вы уже использовали crontab раньше, вы можете проверить это с помощью crontab -l.
christopher@pop-os:~$ crontab -l
no crontab for christopher
christopher@pop-os:~$ crontab -e
no crontab for christopher - 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. Не пытайтесь редактировать файлы здесь.
Что произойдет, если задание cron обнаружит ошибку?
Поведение по умолчанию — отправка результатов по электронной почте. Эта функция предназначена для администраторов, которые могут автоматически отправлять журналы на «локальный» адрес электронной почты в сетевом домене.
Вы можете настроить это самостоятельно, если у вас есть почтовый сервер. Существуют также способы автоматизировать вывод электронной почты в GMail или аналогичные службы. Однако эти методы выходят за рамки данной статьи.
Вместо этого мы рассмотрим два распространенных способа устранения ошибки.
1) Отправить вывод в файл
Вы можете указать файл для отправки этого типа вывода, а затем использовать >>
для перенаправления вывода.
Использование >>
добавит информацию в существующий файл, а одиночный символ >
перезапишет файл. Это важно знать, если вы хотите поддерживать большой файл журнала, в котором записи часто обновляются. Оба автоматически создадут файл, если он не существует.
Пример задания Cron:
0 * * * * echo "Linux is Cool!" >> ~/crontab_log.txt
2) Используйте /dev/null
Это позволит обойти опцию электронной почты, по сути удалив данные. Стандартная ошибка («2») и стандартный вывод («1») отправляются в файл /dev/null.
0 0 * * * echo "Why are you silencing me every night at midnight?" > /dev/null 2>&1
Возможно, вы заметили, что в примерах я использую команды echo. Для этого нет особой причины, но это позволяет легко проверить изменения и «проверить свою работу».
Если вы занимались программированием, возможно, вы использовали команды печати для проверки своей логики. Это та же самая концепция.
Давайте попробуем настроить нашу собственную работу 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 |
Есть идеи, что здесь написано? Ради этого урока я сделал эту работу особенно запутанной. Было бы необычно иметь что-то с таким количеством параметров «в дикой природе», но давайте посмотрим, сможете ли вы это расшифровать. Для чего-то подобного мне нравится работать по полям задом наперед.
Давайте попробуем это вместе:
Field | Value | Meaning |
---|---|---|
Day Name | 0,6 | Saturday and Sunday |
Month | */2 | Every month that is divisible by 2 (even) months. |
Day Date | * | Every Date |
Hour | 3-6 | Between 3 and 6 AM |
Minutes | */5 | Every 5 Minutes |
Простым языком:
Поэтому раз в два месяца, по выходным, независимо от даты, эта команда будет выполняться каждые 5 минут с 3 до 6 утра.
Ух ты, это было запутанно. Если вы смогли следовать этому, вы готовы выполнять работу cron с лучшими из них.
Напишите простой скрипт автоматизации cron для резервного копирования файлов.
До этого момента написанные вами задания cron выполняли только одну задачу. Это может быть полезно, но, возможно, вы захотите выполнить несколько задач.
К счастью, это не только возможно, но и очень легко. Если вы помните исходный пример синтаксиса, вы также можете использовать путь к скрипту.
Это не ограничивается только bash: вы также можете реализовать сценарий, использующий Python или Perl, если хотите.
Каковы наши цели?
Задания будут обрабатываться в 3 часа ночи каждую ночь.
Резервное копирование папки /Documents в zip-файл.
Создать текстовый файл со списком всего, что есть в каталоге.
Создайте архивную папку, которая клонирует нашу резервную копию и текстовый файл в подпапку с текущей датой.
our_backup_script.sh
#! /bin/bash
DATE=$(date +%d-%m-%Y)
# Date in format DAY##-MONTH##-YEAR####
mkdir -p ~/archive/$DATE
# create a folder for today's date in the archive, if archive doesn't exist, make archive
ls -al ~/Documents > ~/archive/$DATE/contents.txt
# create a text file listing the contents of the documents folder
cd ~/ && tar -cpzf $DATE.docs.backup.gz Documents/*
# change to parent directory to tar /Documents folder
cp ~/$DATE.docs.backup.gz ~/archive/$DATE/documents_archive.gz
# one .gz file is left in the home directory, a clone is sent to our archive under it's date
christopher@pop-os:~$ ls
Desktop Downloads Music Pictures Public Videos
Documents ENV our_backup_script.sh projects Templates 'VirtualBox VMs'
christopher@pop-os:~$ bash our_backup_script.sh
christopher@pop-os:~$ ls
25-11-2019.docs.backup.gz Documents Music projects Videos
archive Downloads our_backup_script.sh Public 'VirtualBox VMs'
Desktop ENV Pictures Templates
christopher@pop-os:~$ ls archive/25-11-2019/
contents.all_files.txt documents_archive.gz
Осталось только превратить этот скрипт в работу cron.
crontab -e
И добавьте туда следующее:
0 3 * * * bash ~/our_backup_script.sh
Был ли ваш успех успешным? Мой был. На самом деле, мне настолько понравилась эта идея, что я мог бы просто сохранить ее в качестве ежедневной резервной копии. Одно из изменений, которое я внесу, — это переместить архив в папку на моем компьютере, которая синхронизируется с облачным хранилищем.
Вот краткое изложение того, что вы узнали:
Другой способ планирования заданий в Linux — использование команды at. Возможно, вам тоже будет интересно узнать об этом.
Есть ли у вас идеи для сценария, который вы, возможно, захотите создать? Помогла ли вам эта статья лучше понять crontab? Поделитесь с нами в комментариях.