Создать cron задание

Создать 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
Теперь cron будет отправлять мне отчет о работе на мой указанный email.
Приведу еще пример сценария cron:
# Выполнять задание в 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-ом.

Но это не совсем каждые три дня! Нет, это на самом деле не один раз в три дня. Это каждые три дня в месяц, но в новом месяце все сбрасывает на первоечисло, ( независимо когда был последний запуск). И опять же, это хорошо, если это то, что вам нужно…..
Если вы на самом деле нуждаетесь в «корректной работе»  и чтобы крон запускался каждые три дня и каждый году, вот бонус для вас. Для решения этой задачи, яхочукрон запускать каждый день, а затем проверить равномерно ли делится год на три — после учета нашего смещение для начала 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

Вот такой финт ушами 🙂 Идем далее и узнаем больше о кроне 😉

cron имеет несколько каталогов и конфигурационный файл:
  • /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-вс)
cron1
 
Можно заменить пять полей времени немного по др:
@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 минут»
ПРИМЕЧАНИЕ: После последним кронтаб — заданием нужно поставить «Enter»- переход на новую строку, может не работать задание!

Пример, следующий крон, выполнит задание раз в день:

@daily /home/my_script.sh
Как использовать операторы?
Оператор позволяет указать несколько значений в поле. Вот следующие операторы которые могут быть использованы:
  • Звездочка (*) : Этот оператор определяет все возможные значения для поля. Например, звездочка в поле час будет выплнять крон каждый час, если стоит звездочка в поле месяц, то будет задание выполняться каждого месяц.
  • Запятая (,) : Этот оператор определяет список значений, например: «1,5,10,15,20, 25».
  • Тире (–) : Этот оператор определяет диапазон значений, например: «5-15» дней, что эквивалентно вводу с помощью оператора запятая — «5,6,7,8,9, …, 13,14,15.» .
  • Сепаратор или слеш (/) : Этот оператор определяет значение шага, например: «0-23/» может быть использован в поле часов, чтобы указать выполнение команды каждый последующий час. Шаги также разрешается после звездочки, так что если вы хотите указать  выполнение команд\скриптов через каждые два часа, то просто используйте */2.
Нужно посмотреть запущен ли cron в системе- легко:
# ps -ax | grep cron
Можно посмотреть список заданий в кроне у каждого пользователя (например у пользователя captain):
# crontab -l -u captain
Или отредактировать крон задание у пользователя captain:

# crontab -e -u captain

Безопасность в cron

Иногда, нужно сделать так, чтобы некоторый пользователь который имеет доступ к ОС, тоже имел возможность создавать записи crontab или наоборот — запретить ему. За это отвечает следующие файлы:
  • /etc/cron.deny
  • /etc/cron.allow
По умолчанию, данных файлов нет в ОС и все могут создавать различные задачи в crontab (запускать и выполнять скрипты).
Их использование аналогично как и у:
  • /etc/hosts.allow
  • /etc/hosts/deny
Для начала, проверяется что написано в cron.allow и обычно прописывают «ALL» в cron.deny, а после чего,  добавляются  пользователи в cron.allow, которым необходим доступ к cron-у.

Можете  легко проверить, какие файлы, принадлежат к 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 задание — очень просто!

4 thoughts on “Создать cron задание

  1. Если у меня комп в это время будет выключен, то задание не выполниться при включении питания, а будет ждать следующее воскресенье?

    Выполнять задание по воскресеньям в 11 час 25 минут
    25 11 * * 0 /home/captain/scripts/script_df-H.pl

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.