ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

Понимание Crontab в Linux с примерами

Как использовать задачи в cron для автоматизации на Ubuntu 14.04

Crontab используется для автоматизации всех типов задач в системах Linux. Это особенно важный навык для начинающих системных администраторов. Это может быть довольно сложно начать, если вы новичок. Синтаксис отличается от большинства других команд. По этой причине эта статья будет содержать немного дополнительной справочной информации, прежде чем мы покажем вам некоторые из применений.

Не пугайтесь crontab

Для нас Crontab был одной из самых пугающих концепций Linux как новичок. В то время, когда мы познакомились с ‘crontab’, мы использовали командную строку всего несколько дней и почти не понимали, как использовать основные команды навигации по файлам, такие как ‘ls’ и ‘cd’.

Причина, по которой мы приводим свою личную историю обучения, заключается в том, что многие новые пользователи Linux могут испытывать такое же поражение, когда смотрят на уникальный синтаксис «crontab». Мы можем заверить вас, хотя, это не так сложно, когда вы понимаете, как это работает.

 

Что вы узнаете в этой статье

Мы кратко расскажем о некоторых концепциях, связанных с crontab, чтобы облегчить понимание. Наша цель – контекстуализировать эти понятия и проиллюстрировать, как они связаны друг с другом.

 

Краткое введение в ключевые концепции cron

Позвольте сначала познакомить вас с некоторой базовой концепцией «cron».

 

Разница между 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 запущен.

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

 

Мы видим, что демон запущен для нашей учетной записи.

 

Понимание синтаксиса Crontab

Теперь, когда у вас есть смутное представление о том, как работает cron, давайте посмотрим на синтаксис использования crontab. Мы надеемся, что это менее запутанно, если вы можете представить эту информацию в виде таблицы в вашем уме.

crontab [options]

* * * * *  <command> 
OR 
* * * * * <path/to/script>

 

Мы обещаем, что это произойдет, потому что для вас, как только мы приведем в действие наш собственный пример. Давайте снова рассмотрим синтаксис для заданий cron.

Как заменить WordPress Cron с действительный Cronjob

 

Как видите, синтаксис 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, вы можете проверить это с помощью 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. Это действительно зависит от вас.

 

Если сначала не получится, sudo

Если вы попытаетесь выполнить команду crontab -e, но не получите этот результат, у вас могут не быть привилегий пользователя для создания таблицы. Если у вас есть доступ к sudo, вы можете использовать sudo для установки crontab.

sudo crontab -e <your_username>

 

Ваша система автоматически загрузит ваш crontab в нужное место, которое может варьироваться в зависимости от дистрибутива, но часто находится в каталоге, таком как /var/spool/cron/crontabs. Не пытайтесь редактировать файлы здесь.

 

Что произойдет, если задание cron обнаружит ошибку?

Поведение по умолчанию – отправлять по электронной почте свой вывод. Эта функция предназначена для администраторов, которые могут автоматически отправлять журналы на «локальную» электронную почту в домене сети.

Вы можете настроить это самостоятельно, если у вас есть почтовый сервер. Существуют также способы автоматизации вывода электронной почты в GMail или аналогичные сервисы. Тем не менее, эти методы выходят за рамки данной статьи.

Вместо этого мы рассмотрим два распространенных способа обойти ошибку.

 

1) Отправить вывод в файл

Вы можете назначить файл для этого типа вывода для отправки, а затем использовать >> для перенаправления вывода.

Использование >>добавит информацию в существующий файл, в то время как один символ > перезапишет файл. Это важно знать, если вы хотите поддерживать большой файл журнала, который часто обновляет записи. Оба автоматически создадут файл, если он не существует.

Пример работы Cron:

0 * * * *  echo "Linux это круто!" >> ~/crontab_log.txt

 

2) Используйте /dev/null

Это обойдёт опцию электронной почты, по сути удалив данные. Стандартная ошибка (‘2’) и стандартный вывод (‘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 минут

 

На простом языке:

Таким образом, каждый второй месяц, по выходным, независимо от даты, эта команда будет выполняться каждые 5 минут между 3 утра и 6 утра.

 

Вау, это было запутанно. Если вы смогли следовать этому, вы готовы справиться с лучшими из них.

 

Напишите простой скрипт автоматизации cron для резервного копирования файлов.

До этого момента написанные вами задания 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? Поделитесь с нами в комментариях.

Exit mobile version