Tools Blog

Разбиране на изразите на Cron: Практическо ръководство за автоматизация на задачи

Cron Job Automation

Ако някога сте управлявали Linux сървър, работили сте в backend разработката или сте настройвали автоматизирани облачни функции, вероятно сте срещали низ, който изглежда нещо подобно: 0 2 * * *. За незапознатите изглежда като печатна грешка, оставена на клавиатурата. За системните администратори това е сърцето на съвременната автоматизация на инфраструктурата: Cron Expression.

Cron е невидимият двигател, управляващ интернет. Той гарантира, че вашата база данни се архивира в 3:00 сутринта, задейства имейлите, които получавате всеки понеделник сутрин, и изчиства временните сървърни файлове, преди да сринат системата. Но въпреки силата си, синтаксисът е изключително труден за анализиране от хората. В това дълбоко гмуркане ще демистифицираме звездичките и ще ви научим как да четете и пишете графици на cron като опитен DevOps инженер.

Какво е Cron и Crontab?

Cron е базиран на времето планировчик на задания, намиращ се в Unix-подобни компютърни операционни системи. Името "cron" идва от гръцката дума за време, chronos. Потребителите, които настройват и поддържат софтуерни среди, използват cron, за да планират задачи (команди или скриптове на обвивката), които да се изпълняват периодично на фиксирани часове, дати или интервали.

Crontab (Cron Table) е конфигурационният файл, където се съхраняват тези графици. Когато редактирате своя crontab чрез терминала, вие пишете списък с инструкции, казващи на сървъра какво точно да изпълни и кога.

Деконструиране на 5-те звездички

Стандартният cron израз се състои от 5 полета, разделени с бяло пространство. Всяко поле представлява конкретна единица време и те винаги се четат отляво надясно в този точен ред:

* * * * *  command_to_execute
- - - - -
| | | | |
| | | | +----- Day of the Week (0 - 6) (Sunday=0 or 7)
| | | +------- Month (1 - 12)
| | +--------- Day of the Month (1 - 31)
| +----------- Hour (0 - 23)
+------------- Minute (0 - 59)

Звездичка (*) означава "всяка възможна стойност за това поле". И така, изразът * * * * * буквално се превежда на: „Бягай всяка минута, на всеки час, на всеки ден, на всеки месец, на всеки ден от седмицата.“

Модификатори на синтаксиса: стъпки, диапазони и списъци

Силата на cron идва от неговите модификатори. Не сте ограничени само до конкретни числа или „всичко“.

1. Модификатор на стъпки (/)

Ако искате скрипт да се изпълнява на всеки 15 минути, използвайте стъпка. */15 * * * * означава "всяка минута, която се дели на 15". Той ще работи в 0, 15, 30 и 45 след час.

2. Модификатор на обхват (-)

Ако искате скрипт да се изпълнява само през работно време, вие използвате диапазон. 0 9-17 * * * означава „стартирай на нулева минута, всеки час от 9 сутринта до 5 следобед“.

3. Модификаторът на списъка (,)

Ако искате нещо да работи в конкретни, непоследователни дни, използвайте списък. 0 0 1,15 * * означава "изпълни в полунощ на 1-во и 15-о число от месеца".

Спрете да гадаете Cron изрази

Не рискувайте да стартирате резервен скрипт всяка минута вместо всеки месец. Една единствена правописна грешка може да срине производствен сървър. Използвайте нашия интерактивен визуален генератор, за да създавате и валидирате cron низове безопасно.

Отворете Cron Job Generator

Най-опасната Cron грешка

Най-честата и катастрофална грешка, която разработчиците допускат, е объркването на полето „Минута“. Нека да разгледаме сценарий, при който искате да стартирате скрипт за почистване на база данни веднъж на час в 2:00 сутринта.

Грешката: * 2 * * *

Ако напишете горното, вие казвате на сървъра да изпълни скрипта „Всяка минута, по време на 2-рия час от деня“. Вашият тежък скрипт за почистване на база данни ще се задейства 60 последователни пъти, като вероятно ще претовари процесора ви, ще заключи таблиците на базата данни и ще причини масивно прекъсване.

Правилният начин: 0 2 * * *

Това изрично указва на сървъра да работи само на „Минута нула, на 2-рия час“. Ще се изпълни точно веднъж в 2:00 сутринта.

Често задавани въпроси (FAQ)

Отчита ли cron часовите зони?

По подразбиране cron оценява изрази въз основа на локалното системно време на сървъра, на който работи. Ако вашият сървър се хоства в регион на AWS в Лондон, той работи по UTC/GMT. Трябва да отчетете разликите в часовите зони, ако вашите потребители са в Ню Йорк или Токио.

Мога ли да планирам изпълнение на cron задача всяка секунда?

Не. Стандартният Unix cron е ограничен до резолюция от една минута. Ако имате нужда от подминутно планиране (напр. на всеки 10 секунди), трябва да използвате отделен инструмент за демон или да напишете скрипт, който се изпълнява всяка минута, но зацикля вътрешно с команди за заспиване.

Какво означават низове като @daily или @hourly?

Много съвременни реализации на cron поддържат нестандартни предварително дефинирани макроси, за да направят планирането по-лесно. @daily е точно същото като 0 0 * * * (полунощ всеки ден). @hourly е същото като 0 * * * *. Въпреки че са полезни, те не се поддържат универсално във всички наследени системи.