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

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

Кронтаб это список команд, которые вы хотите запустить по расписанию. Cron — системный процесс, который будет автоматически выполнять задачи, для вас в соответствии с установленным графиком.  В своей теме «создать cron задание» я расскажу как создавать различные расписания для разных нужд.

Мне нужно было создать крон задание, которое бы раз в час генерировало отчет о свободном месте на дисках и отсылало этот отчет на email. Делается это очень просто:

Нужно отредактировать кронтаб и добавить ему новое задание виде скрипта или как у менястрока с командой):

sh
1 lines

# ee /etc/crontab

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

sh
9 lines

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 ·dfH

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Теперь cron будет отправлять мне отчет о работе на мой указанный email.
Приведу еще пример сценария cron:
sh
55 lines

# Выполнять задание в 15 часов 3 минут 27 мая если это пятница
3 15 13 27 5 /home/captain/scripts/script_dfH.pl
# Выполнять скрипт 1 раз в час в 0 минут
0 */1 * * * /home/captain/scripts/script_dfH.pl
# Выполнять задание каждые 8 часов в 0 минут
0 */8 * * * /home/captain/scripts/script_dfH.pl
# Выполнять задание по воскресеньям в 11 час 25 минут
25 11 * * 0 /home/captain/scripts/script_dfH.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 * * * 15 /usr/local/bin/my_checks_in_HDD.sh
#Выполнять в рабочее время:
#Данный скрипт будет запускаться 1 раз в день с 8-18ч.
00 0818 * * 15 /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 1521 * 4 /usr/local/bin/check_disk_space.sh
#Каждый день через 25 мин после каждого четного часа:
#Скрипт запуститься каждый день через 25 минут после каждого четного часа (00:25, 02:25…22:25).
25 023/2 * * * /usr/local/bin/check_disk_space.sh

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

 Думаете что установить крон это легко?- Да это так, но иногда случаются казусы, рассмотрим пример:
sh
1 lines

30 05 */3 * * execute_this

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Вышеустановленный крон запустит `execute_this` в 5:30 утра каждые три дня, но предположим что у нас Новый Год. Когда будет запускаться крон, 1 января? Вообще-то, нет. Это будет выполнен 3-го января.

«*/3» можно рассматривать как «любого числа которые делится на три». Это означает, что он всегда будет работать 3-го, 6-го, 9-го и т.д. Это хорошо если данный крон подходит, но а если вам нужно чтобы он запускался 1-го, 4-го и т.д. Как мы это делаем?

sh
1 lines

30 05 131/3 * * execute_this

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Этот кронджоб выполниться с 1-го до 31 (включительно). Это, как мы получаем смещение, чтобы начать на 1-ом.

Но это не совсем каждые три дня! Нет, это на самом деле не один раз в три дня. Это каждые три дня в месяц, но в новом месяце все сбрасывает на первоечисло, ( независимо когда был последний запуск). И опять же, это хорошо, если это то, что вам нужно…..
Если вы на самом деле нуждаетесь в «корректной работе»  и чтобы крон запускался каждые три дня и каждый году, вот бонус для вас. Для решения этой задачи, яхочукрон запускать каждый день, а затем проверить равномерно ли делится год на три — после учета нашего смещение для начала 1-го числа в новом году.
Команда «день года»  вычисляеться:
sh
1 lines

date +%-j

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

sh
1 lines

$(( `date +%-j` % 3 ))

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Так что, если этот расчет равен нулю, у нас есть «победитель»:

sh
1 lines

[ $(( `date +%-j` % 3 )) == 0 ]

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Помните, нам нужно смещение, так что мы начинаем c 1-го числа. Так оно и есть в настоящее время, и крон запускается с 3-го. Только путем вычитания одного дня с года можно получить все желаемое:

sh
1 lines

[ $(( $(( `date +%-j` 1 )) % 3 )) == 0 ]

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

И так, финишнай КРОН будет выглядеть так:

sh
1 lines

30 05 * * * [ $(( $(( `date +%-j` 1 )) % 3 )) == 0 ] && execute_this

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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-вс)

<img loading=»lazy» class=»aligncenter size-full wp-image-329″ src=»http://linux-notes.org/wp-content/uploads/2014/01/cron1.png» alt=»cron1″ width=»494″ height=»231″ srcset=»https://linux-notes.org/wp-content/uploads/2014/01/cron1.png 494w, https://linux-notes.org/wp-content/uploads/2014/01/cron1-300×140.png 300w» sizes=»(max-width: 494px) 100vw, 494px» />

 
Можно заменить пять полей времени немного по др:
sh
15 lines

@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 минут»

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

ПРИМЕЧАНИЕ: После последним кронтаб — заданием нужно поставить «Enter»- переход на новую строку, может не работать задание!

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

sh
1 lines

@daily /home/my_script.sh

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

# ps -ax | grep cron

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Можно посмотреть список заданий в кроне у каждого пользователя (например у пользователя captain):
sh
1 lines

# crontab -l -u captain

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Или отредактировать крон задание у пользователя captain:

sh
1 lines

# crontab -e -u captain

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

Можете  легко проверить, какие файлы, принадлежат к cron- у:

sh
1 lines

$ ls /etc | grep cron

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Опции в crontab

-u 
Добавьте имя пользователя от которого он будет запускаться. Если эта опция не указана, то кронтаб рассматривает «свой» кронтаб (т.е. кронтаб будет запускаться от текущего пользователя и выполнять команду). Обратите внимание, что «su» может запутать кронтаб и вы всегда должны использовать опцию -u для безопасности.

-l
Показать текущий кронтаб.

-r
Удалить текущий кронтаб.

-e
Редактировать текущий кронтаб, с помощью редактора ( визуального или редактора в переменном окружении).

-i
То же что и опция «-r», но дает пользователю выбора «Y/n» перед удалением в crontab.

-s
Только SELinux: добавляет текущий SELinux контекст безопасности (строку  MLS_LEVEL) к файлу кронтаб до редактирования или замены.

бекапы cronjob

Так же, можно создавать бэкапы:

sh
2 lines

# crontab -l >/home/my_crontab
# crontab -u captain·-l >/home/my_crontab_of_captain_user

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Создать cron задание — очень просто!

Было ли это полезно?

0 / 0