Очень часто возникает необходимость выполнять нужные задачи в определенный период времени (периодическая очистка диска, запуск будильника, выключение компьютера по расписанию, и т.д.) Для этого в Linux, и в Ubuntu в частности, существует демон-планировщик Cron.
Что такое Cron и Crontab?
Cron это процесс, демон, либо программа, которая активируется один раз в минуту и следит за работой, которую нужно выполнить в данный момент. А вот Crontab это тот самый список заданий, за которым следит Cron.
Для редактирования расписания crontab используйте следующую команду
crontab -e
Если редактор по умолчанию не определен, то вы увидите сообщение об ошибке:
/bin/sh: /bin/vi: No such file or directory
crontab: «/bin/vi» exited with status 127
Для того чтоб определить используемый редактор по умолчанию, выполним
export EDITOR=gedit
В данном случае будет использоваться редактор Gedit. Вместо Gedit можно использовать любой другой редактор, например vim, geany, emacs, nano, mcedit (нужно иметь установленный менеджер mc) и т.д.
Если будете редактировать в консольном редакторе nano, то нужно запомнить несколько комбинаций. После ввода нужной записи или команды надо ее сохранить. Для этого нажмем комбинацию клавиш — crtl+o, далее подтердим нажатием Enter. После всего выйдем из редактора комбинацией — ctrl+x.
Каждое задание пишем с новой строки.
Итак с редактором определились, и снова вводим команду:
crontab -e
Откроется ваш файл crontab.
Синтаксис для планирования задач довольно простой и нужно просто вникнуть в его суть.
* * * * * путь к команде или скрипту
Разберем назначение пяти снежинок.
Первая *: Минуты — интервал значений: 0-59
Вторая *: Часы — интервал значений: 0-23
Третья *: День — интервал значений: 1-31
Четвертая *: Месяц — интервал значений: 1-12
Пятая *: День недели — интервал значений: 0-7 (воскресенье имеет значение — 0 или 7, понедельник — 1, вторник — 2, и т.д.)
Если любая * не изменяется, то значит она работает по умолчанию. Что это значит? Если не изменять первую * (минуты), то значит команда будет срабатывать каждую минуту, если не будет изменена вторая * (часы), то команда будет срабатывать каждый час и т.д. Смысл думаю понятен.
В самом конце впишите следующий текст:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
Это не обязательно, но желательно. Данный текст позволит выполнять программы, не прописывая полный путь до этих программ. Но полный путь к вашим скриптам писать все же придется.
Все скрипты, которые будем использовать, должны быть исполняемыми. Это можно сделать так: правой кнопкой по скрипту — Свойства — Права — ставим галочку «Разрешить выполнение файла как программы», либо в Терминале:
chmod +x путь к нужному скрипту.sh
Теперь разберем несколько примеров для закрепления знаний.
Допустим, нужно выполнять скрипт time.sh каждый день в 6:00 вечера. Запись будет выглядеть таким образом:
0 18 * * * /home/user/time.sh
Чтобы задать периодичность срабатывания, программы или скрипта, используется /. К примеру, если нужно выполнять задачу каждые 5 минут по понедельникам, то запись будет следующей:
*/5 * * * 1
Данная запись будет выполнять скрипт time.sh каждые 3 часа по вторникам и пятницам:
0 */3 * * 2,5 /home/user/time.sh
Еще порция примеров:
выполнять задание один раз в час в 15 минут:
15 */1 * * * /home/user/time.sh
выполнять задание каждые 5 часов в 20 минут:
20 */5 * * * /home/user/time.sh
выполнять задание по средам в 6 часов 15 минут вечера:
15 18 * * 3 /home/user/time.sh
выполнять задание 12 февраля в 0 часов 1 минуту каждый год:
1 0 12 2 * /home/user/time.sh
выполнять задание в воскресенье 27 числа в 13 часов 47 минут:
47 13 27 * 0 /home/user/time.sh
выполнять задание каждый месяц 10 числа в 4 часа 10 минут:
10 4 10 * * /home/user/time.sh
выполнять задание каждую минуту:
* * * * * /home/user/time.sh
выполнять задание раз в час по будням:
0 * * * 1-5 /home/user/time.sh
выполнять задание каждый четный час:
* */2 * * * /home/user/time.sh
Дополнительные параметры Cron:
Переменная | Описание | Эквивалент |
@reboot | Запуск при загрузке | |
@yearly | Раз в год | 0 0 1 1 * |
@annually | Тоже что и @yearly | |
@monthly | Раз в месяц | 0 0 1 * * |
@weekly | Раз в неделю | 0 0 * * 0 |
@daily | Раз в день | 0 0 * * * |
@midnight | В полночь | (00:00) |
@hourly | Каждый час | 0 * * * * |
Пример: если нужно выполнять задание при входе в систему, то команда будет такой вид:
@reboot root /home/user/time.sh
Если нужно выполнить программу, которая имеет графический интерфейс, то после настройки времени-даты нужно вставить:
export DISPLAY=:0
Вся команда будет иметь следующий вид:
58 21 * * * export DISPLAY=:0 && /home/dm/My_Scripts/sleep.sh
Ваш crontab-файл будет находится в /var/spool/cron/crontabs/пользователь.
Посмотреть список всех заданных заданий в cron можно командой:
crontab -l
Чтобы установить задание от другого пользователя нужно выполнить следующую команду:
sudo crontab -e -u user
вместо user пишем нужное имя.
Более подробно о cron можно узнать тут — http://help.ubuntu.ru/wiki/cron или https://ru.wikipedia.org/wiki/Cron
Оказывается, что пользователи Windows, тоже могут использовать всю мощь планировщика задач — cron. Допустим можно запланировать проверку жесткого диска на наличие вирусов, к примеру антивирусом от Dr. Web. Вы можете скачать dr. Web CureIt на сайте download.net. Как оказалось, чтобы запустить cron в «винде», нужно потратить немало времени и повозиться с настройками. Но нам это не грозит. В Убунту все работает «из коробки».
На этом разрешите откланяться и простите за многобукаф.
чем больше работаю на Убунту, мне больше мне это нравится)
чем больше работаю на Убунду, тем больше мне это нравится)
И мне)))
«выполнять задание в воскресенье 27 числа в 13 часов 47 минут:
13 47 27 * 0 /home/user/time.sh»
нужно переставить местами 13 и 47
Спасибо, все верно. Не заметил. Исправил!!!
Здраствуйте, подскажите — создал файл
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use ‘*’ in these fields (for ‘any’).#
# Notice that tasks will be started based on the cron’s system
# daemon’s notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
@reboot root /home/dell/display.sh
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
после нажатия сохранить — gedit выводит красным «не удалось найти файл /tmp/crontab.150v8m/crontab»
Что делать?
Лучше все сделать при помощи консольного nano