cron — утиліта в операційних системах Unix і Linux, яка дозволяє користувачам виконувати команди або скрипти (групи команд) автоматично в заданий час. Назва cron походить від грецького слова χρόνος (chronos), що означає «час», помилково записаного як cron Кеном Томпсоном.
Файл завдань crontab
Кожен користувач системи має свій файл завдань crontab
(за даними деяких джерел, назва файлу походить від cron table), в якому описано, в який час і які команди і програми запускати від імені цього користувача.
Параметри запуску crontab
Для редагування файлу crontab використовується спеціальна однойменна команда crontab, яка дозволяє не переривати процес cron на час редагування:
-е
— команда запускання файлу crontab для його редагування. (англ. edit)-l
— команда запускання файлу щоб продивитися його зміст. (англ. list)-r
— видалити crontab файл для цього користувача (видалити свій crontab) . (англ. remove)
Таблиця crontab
Кожний рядок у файлі crontab складається з п'яти колонок, що відокремлюються пробілами чи табуляціями. Стовпчики задають час виконання (Хвилина, Година, День, Місяць, День тижня), в них може міститися число, список чисел, або символ '*'. Решта символів в рядку інтерпретуються як виконувана команда та її параметри.
# .---------------- хвилина (0 - 59) # | .------------- година (0 - 23) # | | .---------- день місяця (1 - 31) # | | | .------- місяць (1 - 12) АБО jan,feb,mar,apr ... # | | | | .---- день тижня (0 - 6) (неділя=0 чи 7) АБО sun,mon,tue,wed,thu,fri,sat # | | | | | * * * * * виконувана команда
Оператори
Є кілька способів визначення кількох значень часу для однієї команди:
- Кома (
','
) оператор визначає список значень, наприклад:1,3,4,7,8
- Тире (
'-'
) оператор визначає діапазон значень, наприклад:1-6
, (теж саме що і1,2,3,4,5,6
) - Зірочка (
'*'
) оператор визначає всі можливі значення. Наприклад, друга зірочка означає кожну годину. - Слеш (
'/'
) оператор визначає крок значень, наприклад:*/6
, (теж саме що 0,6,12,18,24....)
Нестандартні макроси
Деякі реалізації cron
підтримують наступні нестандартні макроси:
Макрос | Опис | Еквівалент |
---|---|---|
@yearly (або @annually) | Виконання щороку опівночі 1 січня | 0 0 1 1 * |
@monthly | Виконання щомісяця опівночі першого числа | 0 0 1 * * |
@weekly | Виконання щотижня опівночі (у неділю) | 0 0 * * 0 |
@daily (або @midnight) | Виконання кожної доби опівночі | 0 0 * * * |
@hourly | Виконання щогодини (на початку години) | 0 * * * * |
@reboot | Виконання під час запуску демона | N/A |
@reboot
обумовлює виконання під час запуску демона. Оскільки перезапуск самого cron
є нетиповим випадком, фактично виконання відбувається під час запуску оперційної системи, тобто простий перезапуск демону не призводить до виконання завдань, визначених у @reboot
. Така поведінка притаманна деяким реалізаціям cron
, наприклад у Debian.
@reboot
може використовуватись у випадку необхідності запуску завдання від користувача, якщо цей користувач не може змінити конфігурацію init для запуску відповідних програм.
Приклад
Щодня через одну хвилину після опівночі видалити вміст файлу /www/apache/logs/error_log
:
01 00 * * * cat /dev/null > /www/apache/logs/error_log
Змінні середовища
Змінні середовища що впливають на роботу cron
- HOME — шлях до домашньої директорії користувача.
- LOGNAME — ім'я користувача для входу в систему.
- PATH — шлях пошуку стандартних інструментів.
- SHELL — шлях до оболонки командного інтерпретатора.
- EDITOR i VISUAL — назва текстового редактора що використається для редагування crontab. За замовчуванням цим редактором буде Vi.
- LANG, LC_ALL, LC_CTYPE, LC_MESSAGES змінні для інтернаціоналізації.
Приклад файлу crontab
#Як звичайно, з символу # починаються коментарі # Як командний інтерпретатор використовувати /bin/sh: SHELL=/bin/sh # Результати роботи надсилати на цю адресу MAILTO=my@example.org # Додати в PATH PATH=$PATH:$HOME/bin # # # # Тут починаються завдання # Виконувати кожен день в 0 годин 5 хвилин, результат складати в log/daily: 5 0 * * * $HOME/bin/daily.job>> $HOME/log/daily 2> & 1 # Виконувати першого числа кожного місяця: 15 14 1 * * $HOME/bin/monthly # Виконувати кожного робочого дня в 22:00: 0 22 * * 1-5 echo "Пора додому" 23 */2 * * * echo "Виконується в 0:23, 2:23, 4:23 і т. д." 5 4 * * sun echo "Виконується в 4:05 в неділю" 0 0 1 1 * echo "З новим роком!" 15 10,13 * * 1,4 echo "Цей напис виводиться в понеділок і четвер в 10:15 та 13:15"
Історія
Ранні версії
В Unix Версії 7 cron був написаний Браяном Керніганом і був демоном (програмою-сервісом). Він працював за простим алгоритмом:
- Прочитати crontab
- Якщо якась команда має поточну дату і час запускати її як root користувач.
- Чекати хвилину
- Повторити крок 1.
В університеті Пердью в кінці 1970-х років в експерименті для 100 користувачів система VAX з таким алгоритмом зазнала занадто велике навантаження.
Наступні версії cron були створені з метою розширити можливості для системи Unix, яка має багатьох користувачів. Алгоритм, який використовується в цих cron, виглядає таким чином:
- На початковому етапі або коли є зміни знайти crontab файли для всіх користувачів системи.
- Для кожного crontab визначити коли в майбутньому команда повинна бути виконана.
- Додати цю команду до списку команд за часом
- Основний цикл:
- Визначити коли в майбутньому команда з списку повинна бути запущена.
- Спати протягом цього часу.
- По пробудженню і після перевірки правильності часу, виконати команду з привілеями користувача, який володіє файлом crontab.
- Визначити коли в майбутньому команда з списку повинна бути запущена.
Сучасні версії
Зараз існує декілька різних утиліт з функціональністю cron. Найпоширенішим з них є Vixie cron (створено 1987 року). Версія 3 Vixie cron була випущена в кінці 1993 року. З версії 4.1 в січні 2004 року вона була перейменована в ICS Cron. Версія 3 з деякими дрібними виправленнями використовується в більшості дистрибутивів Linux і системах BSD.
Інші популярні реалізації cron — anacron і fcron. anacron дозволяє виконати команду навіть якщо час для запуску було пропущено (наприклад, комп'ютер було вимкнено). anacron не є самостійною і вимагає наявності cron.
Зноски
- What is the etymology of cron. Процитовано 23 грудня 2015.
- Origin of the word cron?. Архів оригіналу за 2 липня 2019. Процитовано 2 липня 2019.
- . The FreeBSD Project. Архів оригіналу за 1 лютого 2017. Процитовано 2 липня 2019.
- . Bugs.debian.org. Архів оригіналу за 2 липня 2019. Процитовано 6 листопада 2013.
Посилання
- Розумний крон [ 14 травня 2014 у Wayback Machine.] — сервіс розпізнає український текст і перетворює його у час виконання у форматі cron (укр.)
- Open Group's crontab specification [ 5 вересня 2005 у Wayback Machine.] — official UNIX 03 (англ.)
- ISC Cron 4.1 [ 12 жовтня 2006 у Wayback Machine.] (англ.)
- CVSweb for FreeBSD's cron — Vixie cron 3.0 (англ.)
- ACM Digital library — Franta, Maly, «An efficient data structure for the simulation event set» (requires ACM pubs subscription) (англ.)
- Cron Sandbox at HxPI [ 6 листопада 2008 у Wayback Machine.] пропонує інтерактивне отримання часу виконання команди crontab. (англ.)