Управление на cron задачи в Linux

Помощен център

Управление на cron задачи в Linux

Cron задачите позволяват на потребителите на Linux/Unix да изпълняваме команди или скриптове в точно определено време - месец, ден от седмицата, час и минута. Можем също да планираме периодично да се изпълняват скриптове и команди. Cron е един от най-полезните инструменти в Linux/UNIX операционни системи.

Обикновено се използва за изпълнение на административни задачи като архивиране или почистване на директории и др. Услугата cron (демона crond) работи във фонов режим и постоянно проверява файла /etc/crontab, директориите /etc/cron.*/, както и директорията /var/spool/cron/.

Командата crontab

Трябва да използвате командата crontab, за да редактирате/създавате, инсталирате, деинсталирате или съставяте списък с cron задачи. Всеки потребител може да има свой собствен файл crontab и ,въпреки че това са файлове в /var/spool/cron/crontabs, те не са предназначени да бъдат редактирани директно.

Трябва да използвате команда crontab за редактиране или настройка на вашите собствени cron задачи.

Видове конфигурационни файлове за cron

Има различни видове конфигурационни файлове:

Системен crontab: използва се от системни услуги и критични задачи, които изискват root привилегии. Шестото поле (вижте по-долу описание на полето) е името на потребител, от чието име да се изпълнява командата. Това дава възможност на системния crontab да изпълнява команди като всеки потребител.

Потребителски crontabs: Потребителят може да инсталира свои собствени cron задачи, използвайки командата crontab. Шестото поле е командата за изпълнение и всички команди се изпълняват като потребителя, създал съответния crontab.

Създаване на cron задача

За да създадем собствен crontab файл въвеждаме следната команда през командния ред:

sudo crontab -e

Трябва ли да рестартираме crond след промяна на crontab?

Не. Crond проверява времето за модификация на всички crontabs и презарежда тези, които са променени. По този начин crond не трябва да се рестартира всеки път, когато файлa crontab се променя.

Синтаксис на crontab

При въвеждане на crontab следваме следния синтаксис:

1 2 3 4 5 /home/user/dir/command

или

1 2 3 4 5 /dir/dir/script.sh

където:

1: Minute (0-59) - стойност на минутите; 2: Hours (0-23) - стойност за час; 3: Day (0-31)- стойност за ден от месеца; 4: Month (0-12 [12 == December]) - избор на месец; 5: Day of the week(0-7 [7 or 0 == sunday]) - избор на ден от седмицата; /home/user/dir/command – име на скрипта или командата за изпълнение;

Ако отворите файла /etc/crontab с командата sudo nano /etc/crontab, ще видите графично представяне на коректен crontab синтаксис:

# Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * user-name command to be executed

В синтаксиса на системните cron задачи се добавя името на потребителя по следния начин:

1 2 3 4 5 user-name /home/user/dir/command

или

1 2 3 4 5 user-name /dir/dir/script.sh

Управление на crontab в текстов редактор

Управление на crontab с vim/vi

По подразбиране при изпълнение на командата sudo crontab -e, crontab се отваря в редактора vim.

За да въведем cron задача, да запазим информацията и да излезем от vim следваме стъпките:

  • натискаме i за да влезем в INSERT MODE;
  • въвеждаме cron задачата 1 2 3 4 5 /home/user/dir/command;
  • за да изтрием цял ред натискаме dd;
  • натискаме ESC за да излезем от INSERT MODE;
  • натискаме :wq за да запазим файла и да излезем от vim;

Управление на crontab през с nano

Ако нямате опит в работа с vim, може да управлявате crontab през редактора nano като въведете следната команда:

sudo env EDITOR=nano crontab -e

Изтриваме цял ред с клавишната комбинация Ctrl+K, запазваме файла с Ctrl+O и Enter, излизаме от nano с Ctrl+X.

В терминала получаваме потвърждение за създаване на нова cron задача:

crontab: installing new crontab

Изпълнение на cron задача

Ако искаме скриптa /root/script.sh да се изпълнява всяка година в първия ден на месец март в 4:25 часа сутринта, съответния crontab ще изглежда по следния начин.

Първо, отворете crontab за редактиране с предпочитания редактор:

sudo crontab -е или sudo env EDITOR=nano crontab -e

Добавете следния запис:

25 4 1 3 * /root/script.sh

Запазете и затворете файла.

Използване на оператори в синтаксиса на crontab

Операторите ни позволяват да указваме няколко стойности в полето. Има четири оператора:

  • Звездичка (*): посочва всички възможни стойности за поле. Например звездичка в часовото поле за час ще бъде еквивалентна на всеки час или звездичка в полето за месец ще бъде еквивалентна на всеки месец.
  • Запетая (,): посочва списък от стойности, например: "7,14,21,28".
  • Тире (-): посочва диапазон от стойности, например: "5-10" дни, което е еквивалентно на въвеждане "5,6,7,8,9,10" с оператора запетая.
  • Разделител (/): посочва стъпка в съответния интервал, например: "0-23/3" може да се използва в полето часове, за да посочи изпълнението на команда през три часа. Стойността за минути "0-59/10" указва на сървъра да изпълнява скрипта през 10 минути. Определяне на стъпки може да се прави и след звездичка, така че за да укажем интервал през шест часа, въвеждаме"*/6".

Изключително полезно приложение за създаване на коректни crontab стойности за време и интервал може да намерите в този сайт https://cron.help/.

Как да деактивирамe изпращането на имейл от cron?

По подразбиране изходът на команда или скрипт (ако има такъв) се изпраща до вашия системен имейл акаунт. За да спрете получаването на изходен имейл от crontab, трябва да добавите >/dev/null 2>&1 в края на задачата:

0 3 * * * /root/script.sh >/dev/null 2>&1

За да изпратим поща към конкретен имейл акаунт, например e-name@example.com, трябва да дефинираме променливата MAILTO по следния начин:

MAILTO="e-name@example.com"
0 3 * * * /root/script.sh >/dev/null 2>&1

Команди за управление на cron задачи

Показване на списък с cron задачи

  • crontab -l - показва списък с всички cron задачи;
  • crontab -u username -l - показва списък с всички cron задачи на посочения потребител;
[common@vm ~]$ sudo crontab -l
no crontab for root
[common@vm ~]$ crontab -l
no crontab for common
[common@vm ~]$

Изтриване на cron задачи

  • crontab -r - изтрива всички съществуващи cron задачи;
  • crontab -r -u username - изтрива cron задачите на потребителя username. Командата трябва да се изпълни като root;

Използване на пре-дефинирани интервали за пестене на време

Вместо първите пет полета можете да използваме някой от осемте специални израза, като по този начин пестим време и намаляваме вероятността от допускане на синтактични грешки.

Специален изразЗначение
@rebootИзпълнява се само веднъж при стартиране на сървъра.
@yearlyИзпълнява се веднъж годишно, "0 0 1 1 *".
@annually(същото като @yearly)
@monthlyИзпълнява се веднъж месечно, "0 0 1 ".
@weeklyИзпълнява се веднъж седмично, "0 0 0".
@dailyИзпълнява се веднъж на ден, "0 0 *".
@midnight(същото като @daily)
@hourlyИзпълнява се веднъж на час, "0 ".

Следната cron задача създава ежедневен архив:

@daily /home/user/dir/mybackup.sh

Директории на crontab

Съдържание на /etc/crontab файла:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

Ако SHELL няма стойност, cron ще използва shell по подразбиране - sh. Ако променливата PATH няма стойност, трябва да посочваме абсолютния път до файловете. MAILTO показва към кой системен акаунт ще се изпраща изхода на cronjobs.

Cron чете файловете в директорията /etc/cron.d/. Като root потребител или потребител със sudo привилегии, ние можем да използваме следните директории за конфигуриране на cron задачи:

ДиректорияОписание
/etc/cron.d/Поставя всички скриптове в тази директория и ги извиква от файла /etc/crontab
/etc/cron.daily/Изпълнява всички скриптове в директорията веднъж на час.
/etc/cron.monthly/Изпълнява всички скриптове в директорията веднъж на месец.
/etc/cron.weekly/Изпълнява всички скриптове в директорията веднъж на седмица.