Создать cron задание
Кронтаб это список команд, которые вы хотите запустить по расписанию. Cron — системный процесс, который будет автоматически выполнять задачи, для вас в соответствии с установленным графиком. В своей теме «создать cron задание» я расскажу как создавать различные расписания для разных нужд.
Мне нужно было создать крон задание, которое бы раз в час генерировало отчет о свободном месте на дисках и отсылало этот отчет на email. Делается это очень просто:
Нужно отредактировать кронтаб и добавить ему новое задание (в виде скрипта или как у меня — строка с командой):
# ee /etc/crontab
SHELL=/bin/sh PATH=/etc:/bin/sbin:/usr/bin:/usr/sbin HOME=/var/log MAILTO=nvs@8.to #-------------------- # minute hour mday month wday who command # crontab df -H # создать cron задание 0 */1 * * * root df –H
# Выполнять задание в 15 часов 3 минут 27 мая если это пятница 3 15 13 27 5 /home/captain/scripts/script_df-H.pl # Выполнять скрипт 1 раз в час в 0 минут 0 */1 * * * /home/captain/scripts/script_df-H.pl # Выполнять задание каждые 8 часов в 0 минут 0 */8 * * * /home/captain/scripts/script_df-H.pl # Выполнять задание по воскресеньям в 11 час 25 минут 25 11 * * 0 /home/captain/scripts/script_df-H.pl #Задание для каждой минуты: #Скрипт выполниться каждую минуту, день и месяц. * * * * * /usr/local/bin/check_disk_space.sh #Задание для дней: Эта команда будет запускать скрипт checkdrive.sh в 02:30 каждое 10 число января, июня и декабря. 30 02 10 01,06,12 * /home/captain/check_free_space.sh #Каждые полчаса: 00,30 * * * * /home/$user/backup_data.sh #Выполнение на выходных: * * * * 6,7 /usr/bin/my_weekend_screepts # Выполнение 2 раза за 1 день: #Скрипт будет выполняться каждый день в 17:22 и 22:22. 22 17,22 * * * /usr/sbin/some_commands.sh #Выполнение за каждый час в за определенный день: #Скрипт будет выполняться каждый час каждое 2-е мая. 01 * 2 05 * /sbin/system_commands #Выполнение каждые 10 мин в будни (с понедельника по пятницу): */10 * * * 1-5 /usr/local/bin/my_checks_in_HDD.sh #Выполнять в рабочее время: #Данный скрипт будет запускаться 1 раз в день с 8-18ч. 00 08-18 * * 1-5 /usr/local/bin/check_disk_space.sh #1 раз в год, в 00:00 и 1-го января: 0 0 1 1 * /usr/local/bin/check_disk_space.sh #2 раза за год в 15:00 и в 23:00 #Скрипт запуститься 2 раза в год (то есть, каждые 6 мес) в 15:00 и в 23:00. 0 23,15 1 */6 * /usr/local/bin/check_disk_space.sh #Запустить каждый 3-й чт для заданного мес в 06:06: 06 06 15-21 * 4 /usr/local/bin/check_disk_space.sh #Каждый день через 25 мин после каждого четного часа: #Скрипт запуститься каждый день через 25 минут после каждого четного часа (00:25, 02:25...22:25). 25 0-23/2 * * * /usr/local/bin/check_disk_space.sh
30 05 */3 * * execute_this
Вышеустановленный крон запустит `execute_this` в 5:30 утра каждые три дня, но предположим что у нас Новый Год. Когда будет запускаться крон, 1 января? Вообще-то, нет. Это будет выполнен 3-го января.
«*/3» можно рассматривать как «любого числа которые делится на три». Это означает, что он всегда будет работать 3-го, 6-го, 9-го и т.д. Это хорошо если данный крон подходит, но а если вам нужно чтобы он запускался 1-го, 4-го и т.д. Как мы это делаем?
30 05 1-31/3 * * execute_this
Этот кронджоб выполниться с 1-го до 31 (включительно). Это, как мы получаем смещение, чтобы начать на 1-ом.
date +%-j
Теперь я просто проверяю, если это равномерно делится на три по модулю, который возвращает остаток от деления:
$(( `date +%-j` % 3 ))
Так что, если этот расчет равен нулю, у нас есть «победитель»:
[ $(( `date +%-j` % 3 )) == 0 ]
Помните, нам нужно смещение, так что мы начинаем c 1-го числа. Так оно и есть в настоящее время, и крон запускается с 3-го. Только путем вычитания одного дня с года можно получить все желаемое:
[ $(( $(( `date +%-j` - 1 )) % 3 )) == 0 ]
И так, финишнай КРОН будет выглядеть так:
30 05 * * * [ $(( $(( `date +%-j` - 1 )) % 3 )) == 0 ] && execute_this
Вот такой финт ушами 🙂 Идем далее и узнаем больше о кроне 😉
- /etc/cron.d/ — настройки крона.
- /etc/cron.hourly/ — скрипты которые выполняются каждый час.
- /etc/cron.daily/ — скрипты которые выполняются каждый день.
- /etc/cron.weekly/ — скрипты которые выполняются каждую неделю.
- /etc/cron.monthly/ — скрипты которые выполняются каждый месяц.
- /etc/crontab — настройки крона.
- минуты 0-59
- Часы 0-23
- День месяца 1-31
- месяц 1-12
- День недели 0-7 (0-Вс, 1-ПН, 2-Вт, 3-Ср, 4-чт, 5-пт, 6-Сб, 7-вс)
@reboot Запускать при начальной загрузке @yearly Заменяет "0 0 1 1 *" т.е. «ежегодно в 00:00 1 января» @annually Тоже что и yearly @monthly Заменяет "0 0 1 * *" т.е. «каждый мес в 00:00 1 числа» @weekly Заменяет "0 0 * * 0" т.е. «каждый день в 00:00 воскресенье» @daily Заменяет "0 0 * * *" т.е. «каждый день в 00:00» @midnight Тоже что и daily @hourly Заменяет "0 * * * *" т.е. «каждый час в 00 минут»
Пример, следующий крон, выполнит задание раз в день:
@daily /home/my_script.sh
- Звездочка (*) : Этот оператор определяет все возможные значения для поля. Например, звездочка в поле час будет выплнять крон каждый час, если стоит звездочка в поле месяц, то будет задание выполняться каждого месяц.
- Запятая (,) : Этот оператор определяет список значений, например: «1,5,10,15,20, 25».
- Тире (–) : Этот оператор определяет диапазон значений, например: «5-15» дней, что эквивалентно вводу с помощью оператора запятая — «5,6,7,8,9, …, 13,14,15.» .
- Сепаратор или слеш (/) : Этот оператор определяет значение шага, например: «0-23/» может быть использован в поле часов, чтобы указать выполнение команды каждый последующий час. Шаги также разрешается после звездочки, так что если вы хотите указать выполнение команд\скриптов через каждые два часа, то просто используйте */2.
# ps -ax | grep cron
# crontab -l -u captain
# crontab -e -u captain
Безопасность в cron
- /etc/cron.deny
- /etc/cron.allow
- /etc/hosts.allow
- /etc/hosts/deny
Можете легко проверить, какие файлы, принадлежат к cron- у:
$ ls /etc | grep cron
Опции в crontab
-u
Добавьте имя пользователя от которого он будет запускаться. Если эта опция не указана, то кронтаб рассматривает «свой» кронтаб (т.е. кронтаб будет запускаться от текущего пользователя и выполнять команду). Обратите внимание, что «su» может запутать кронтаб и вы всегда должны использовать опцию -u для безопасности.
-l
Показать текущий кронтаб.
-r
Удалить текущий кронтаб.
-e
Редактировать текущий кронтаб, с помощью редактора ( визуального или редактора в переменном окружении).
-i
То же что и опция «-r», но дает пользователю выбора «Y/n» перед удалением в crontab.
-s
Только SELinux: добавляет текущий SELinux контекст безопасности (строку MLS_LEVEL) к файлу кронтаб до редактирования или замены.
бекапы cronjob
Так же, можно создавать бэкапы:
# crontab -l >/home/my_crontab # crontab -u captain -l >/home/my_crontab_of_captain_user
Создать cron задание — очень просто!
У вас лишний пробел в команде
# crontab — l -u captain
Спасибо 😉
Если у меня комп в это время будет выключен, то задание не выполниться при включении питания, а будет ждать следующее воскресенье?
Выполнять задание по воскресеньям в 11 час 25 минут
25 11 * * 0 /home/captain/scripts/script_df-H.pl
Да, все верно.