Обновяване на предпочитанията за бисквитки

Как да добавите задача в Cron

29 May 2025, 22:11:27
Една от най-известните и удобни утилити за автоматизация на задачи на сървъра е Cron. Изпълнението на команди и скриптове по график - това е задачата на тази програма. Основни действия, но именно с тяхна помощ можем да автоматизираме задачи като архивиране, актуализиране и събиране на данни, почистване на временни файлове и много други.
В тази статия ще обърнем внимание на файла crontab, неговия синтаксис и написването на команди с конкретни примери.

Cron и Crontab

Защо говорим за добавяне на задачи в cron, но всъщност използваме командата crontab за това?
Cron - това е системна програма, услуга, сервиз. Тоест самата програма, която следи зададените команди, времето и реализира самата функционалност.
Crontab - това е, по същество, файл, в който записваме времето, задачата за изпълнение и някои други параметри.

Добавяне на задача и структура на файла crontab

За да отворим редактора за промяна или създаване на cron задача за текущия потребител, ще използваме командата:
crontab -eЩе се отвори редакторът по подразбиране (например nano или vim). Как да го промените, можете да разберете в статията Как да промените редактора за crontab.
Внимание, в класическата разкладка на клавиатурата qwerty буквата E се намира до R. Ако въведете командата crontab с параметър -r, това ще изтрие всички правила от сrontab-файла на текущия потребител.
20250529_pyAN5tNv
В горната част на файла можете да видите променливите на околната среда. Те задават условията за изпълнение на задачите в Cron. В примера са използвани две променливи, които се срещат по-често на работните сървъри.

Основни променливи в crontab

  • MAILTO - задава имейл адрес, на който ще се изпраща отчет за изпълнението на задачите cron. MAILTO="" изключва изпращането;
  • PATH - списък с директории с изпълними файлове;
  • SHELL - задача командния интерпретатор за стартиране на задачи. По подразбиране: sh;
  • HOME - директория, от която cron стартира команди. Важна променлива, ако в командите се използват относителни пътища (например ./cron.sh), което е лоша практика.
След променливите на околната среда виждаме редове със задачи. Всеки ред е отделна задача и се състои от две части: график и самата команда.
Графикът се задава с пет стойности:
  • Минути (0-59)
  • Часове (0-23)
  • Ден на месеца (1-31)
  • Месец от годината (1-12)
  • Ден от седмицата (0-7 (0 и 7 — неделя))
Всяко значение има четири специални израза:
  • * - съответства на всякаква стойност (всяка минута, всеки час и т.н.);
  • , - разделител на списък със стойности;
  • - - диапазон на стойностите;
  • / - "делител" на значението.
Първа задача от представения пример:
* * * * * cron.sh >> /root/cron.log 2>&1Той може да се тълкува като: Изпълнява посочената команда всяка минута(*) на всеки час(*) на всеки ден от месеца(*) на всеки месец от годината(*) на всеки ден от седмицата(*). По-просто казано - всяка минута. Това е минималният честотен период, с който cron може да изпълнява задача.
Обърнете внимание, че пътят до изпълнимия файл cron.sh не е посочен, но задачата се изпълнява успешно:
20250530_22be54Z5
Това се случва, защото е зададена променлива на средата PATH, в която е посочена директорията, където се намира този скрипт. Това обаче е лош тон и такъв запис е използван само като пример за работа на променлива на средата. На работни сървъри винаги е по-добре да се използва пълен път до изпълнимия файл или скрипт.

Ще променим графика на задачата и ще добавим конкретно време за стартиране, например:
0 * * * * cron.sh >> /root/cron.log 2>&1Тази задача ще се стартира на 0 минути от всеки час, т.е. веднъж на час.

Както сте разбрали, 0 е указание за конкретна минута, нулева. За да се стартира командата на всеки час в 20 минути, задачата трябва да се преобразува в следния вид:
20 * * * * cron.sh >> /root/cron.log 2>&1
Същата логика важи и за други значения на времето и датата. Нека разгледаме втората задача в примера:
20 4 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1То се стартира всеки ден(*) в 4 часа и 20 минути.

Да приемем, че не е необходимо да създаваме резервно копие толкова често, нека променим тази задача, така че да се изпълнява в неделя (0 или 7) в 3 часа сутринта:
20250529_8ZdgH2sH
Също така е възможно да се посочат няколко конкретни значения, разделени със запетая:
0 3 * * 0,3       /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1Тази задача ще се стартира всяка неделя и сряда точно в 3 часа сутринта.

За да посочим период, диапазон от стойности, използваме -. Заданието ще се стартира в делнични дни, от понеделник до петък (1-5), в 3 часа сутринта:
0 3 * * 1-5       /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
Много често за стартиране на задача през всеки зададен интервал от време се използва израз от вида:
*/30 * * * *     /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1Тази задача на Cron ще се изпълнява на всеки 30 минути.

Обаче не се нуждаем от толкова много резервни копии, по-целесъобразно е да стартираме резервно копиране на всеки два дни:
0 0 */2 * *     /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
Освен полетата за време, графикът може да се задава със специални съкращения, които се четат от хора.

Съкращения на време на crontab

  • @reboot - стартиране на задача след стартиране на системата;
  • @hourly - всеки час;
  • @daily - веднъж на ден (в 00:00);
  • @midnight = @daily;
  • @weekly - веднъж седмично (неделя в 00:00);
  • @monthly - веднъж месечно (на 1-во число в 00:00);
  • @annually - веднъж годишно (1 януари в 00:00);
  • @yearly = @annually.

За да запазите промените в Crontab и да излезете, ако използвате редактора Nano, натиснете Ctrl + O и Ctrl + X.
Ако използвате Vim, натиснете Esc, въведете командата :wq и натиснете Enter.
Ще получите уведомление за добавяне на нови задачи:
20250529_asQdP7yu
За да видите списъка с cron задачи на текущия потребител, можете да използвате командата:
crontab -l20250530_ApI5nYah
Подробно разгледахме процеса на добавяне на cron задачи, синтаксиса на Crontab. Но ако имате затруднения с тази задача на нашите VPS и специализирани сървъри, винаги можете да се обърнете към техническата поддръжка, ще се радваме да ви помогнем!