Crontab с примерами

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 запущен.

 

Эта коман­да будет искать теку­щие про­цес­сы для всех поль­зо­ва­те­лей и воз­вра­щать любые экзем­пля­ры ‘crond’.

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

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

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

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

Как види­те, син­так­сис crontab состо­ит из 5 звез­до­чек. Вот что пред­став­ля­ет каж­дая из этих звездочек:

пер­вая вто­рая тре­тья чет­вёр­тая пятая
* * * * *
ID Мину­ты Часы День Месяц Назва­ние дня
Values 0-59 0 -23 1-31 1-12 0-6

 

ПРИМЕЧАНИЕ
назва­ния дней от 0-6 начи­на­ют­ся с воскресенья.

 

Что­бы запла­ни­ро­вать зада­чу, вы заме­ня­е­те соот­вет­ству­ю­щую звез­доч­ку на жела­е­мое значение.

Давай­те немно­го потре­ни­ру­ем­ся. Если у вас есть crontab, подоб­ный при­ве­ден­но­му ниже, как вы дума­е­те, когда рабо­та будет запущена?

 

Вопрос: Когда коман­да будет запу­ще­на, если вы зада­ди­те зада­ние таким образом?

A. Каж­дый час с поне­дель­ни­ка по субботу
B. Каж­дая мину­та по воскресеньям
C. Толь­ко в пол­ночь с поне­дель­ни­ка по субботу
D. Толь­ко в пол­ночь по воскресеньям

Ответ здесь . Выпол­нять «коман­ду» в 00:00 [пол­ночь] каж­дое воскресенье.

 

Настройте доступ crontab для вашей учетной записи пользователя

Crontab зави­сит от поль­зо­ва­те­ля. Вы уже затро­ну­ли это немно­го. Если вы дума­е­те, что вы уже исполь­зо­ва­ли crontab, вы може­те про­ве­рить это с помо­щью crontab -l .

 

Когда мы запус­ка­ем эту коман­ду, вы види­те, что у нас нет crontab в этой системе.

Посколь­ку мы еще не созда­ли crontab, когда исполь­зу­ем -e для редак­ти­ро­ва­ния таб­ли­цы, он запра­ши­ва­ет наш пред­по­чти­тель­ный тек­сто­вый редак­тор. Nano пред­ла­га­ет­ся в каче­стве самой про­стой в исполь­зо­ва­нии про­грам­мы. Вы може­те исполь­зо­вать любой тек­сто­вый редак­тор команд­ной стро­ки, напри­мер Vim или Emacs. Это дей­стви­тель­но зави­сит от вас.

 

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

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

 

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

 

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

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

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

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

 

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

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

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

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

2) Используйте /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 минут

 

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

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

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

До это­го момен­та напи­сан­ные вами зада­ния cron дела­ли толь­ко одно. Это может быть полез­но, но, воз­мож­но, вы хоти­те сде­лать несколь­ко задач.

К сча­стью, это не толь­ко воз­мож­но, но и очень про­сто. Если вы помни­те из исход­но­го при­ме­ра син­так­си­са, вы так­же може­те исполь­зо­вать путь к сценарию.

Это не огра­ни­чи­ва­ет­ся толь­ко bash, вы так­же може­те реа­ли­зо­вать скрипт, кото­рый исполь­зу­ет Python или Perl, если хотите.

Како­вы наши цели?

  • Рабо­та будет обра­ба­ты­вать­ся в 3 часа ночи каж­дую ночь
  • Резерв­ное копи­ро­ва­ние пап­ку /Documents в zip-файл
  • Создай­те тек­сто­вый файл со спис­ком все­го в каталоге
  • Создай­те архив­ную пап­ку, кото­рая кло­ни­ру­ет нашу резерв­ную копию и тек­сто­вый файл в под­пап­ку с теку­щей датой

 

our_backup_script.sh

Все, что оста­лось сде­лать, сде­лать этот скрипт рабо­той cron.

И добавь­те туда следующее:

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