Если у Вас появилась необходимость запускать на ПК/сервере с Linux определенные команды или скрипты через равный промежуток времени или в назначенное время, то на помощь приходит Crontab! Это планировщик заданий (или менеджер, как больше нравится). Таким образом можно запускать задания резервного копирования, синхронизации, обновления, обслуживания системы и многое другое.
Список задач
Crontab (cron происходит от chronos, c греческого “время”; tab означает таблица) – это служба, которая присутствует в Unix и Unix-подобных операционных системах, используется для планирования периодического выполнения команд. Чтобы посмотреть, какие задачи crontab сейчас активны в Вашей системе, введите в окне терминала следующую команду:
$ sudo crontab -l
Для редактирования списка заданий можно запустить:
$ sudo crontab -e
Это откроет редактор по-умолчанию, чтобы изменять задания crontab. После сохранения файла в редакторе, задания обновятся. Формат записей таков:
* * * * * /home/myscript.sh
Как мы видим, в самом начале идет 5 звезд. Звезды представляют собой различные части даты, их последовательность следующая:
- минута (от 0 до 59)
- час (с 0 до 23)
- день месяца (с 1 по 31)
- месяц (от 1 до 12)
- день недели (от 0 до 6) (0=воскресенье)
Выполнение задания каждую минуту в Crontab
Если Вы установите звездочку, это будет означать буквально все. Например, такая запись, как была выше, определяет выполнение задания каждую минуту:
* * * * * /home/myscript.sh
Задание будет выполняться: каждую минуту, каждый час, каждый день месяца, каждый месяц, и так каждый день на неделе.
Как выполнять задание каждую пятницу в час ночи
Если мы хотим запланировать запуск скрипта в час ночи каждую пятницу, нам понадобится следующая запись в cron:
0 1 * * 5 /home/myscript.sh
Выполняем задание по будним дням в 8:00 утра
0 8 * * 1-5 /home/myscript.sh
Выполнение через 10 минут после каждого часа 1 числа каждого месяца
10 * 1 * * /home/myscript.sh
Честно говоря, все не так сложно, верно? Просто это требует некоторой практики.
Запуск задания каждые 10 минут
Это можно было бы сделать так:
0,10,20,30,40,50 * * * * /home/myscript.sh
Но это не будет красивым решением. Правильнее сделать так:
*/10 * * * * /home/myscript.sh
Специальные слова
В самом начале взамен звездочек применяйте специальные слова:
@reboot При старте ОС @yearly Ежегодно (аналогично: 0 0 1 1 *) @annually (то же, что и @yearly) @monthly Ежемесячно (аналогично: 0 0 1 * *) @weekly Еженедельно (аналогично: 0 0 * * 0) @daily Ежедневно (аналогично: 0 0 * * *) @midnight (то же, что и @daily) @hourly Ежечасно (аналогично: 0 * * * *)
Пример задания, которое будет выполняться каждый день в 00:00:
@daily /home/myscript.sh
Сохранение выходных данных Crontab
По-умолчанию cron сохраняет выходные /bin/execute/this/script.sh данные в почтовый ящик пользователя (в данном случае root). Но это красивее, если выход будет сохраняться в отдельном логе. Сделаем это так:
*/10 * * * * /home/myscript.sh >> /var/log/myscript.log 2>&1
Linux может создавать журналы на разных уровнях. Стандартный выход (STDOUT) и стандартные ошибки (STDERR). STDOUT помечается как 1, STDERR-как 2. Так что… следующая инструкция говорит Linux хранить STDERR в STDOUT, а также, создать один поток данных для сообщений и ошибок:
2>&1
Теперь, когда у нас есть 1 выходной поток, мы можем вылить его в файл. Если знак больше один (>) файл будет перезаписываться, два знака больше (>>) данные всегда будут добавляться к файлу в конец. В нашем случае мы хотели бы добавлять данные:
>> /var/log/script_output.log
Отправка выходных данных на e-mail из Crontab
По умолчанию cron шлет выходные данные на почтовый ящик локального пользователя. Но мы можем настроить Crontab для перенаправления всех выходных данных на реальный адрес электронной почты, добавив следующую переменную в crontab:
MAILTO="name@mymail.com"
Отправка выходных данных Crontab только одного задания cronjob
Если Вы хотите получать по почте выходные данные задания, установите этот пакет:
$ sudo aptitude install mailx
И добавить в задание вот что:
*/10 * * * * /home/myscript.sh 2>&1 | mail -s "Cronjob ouput" yourname@yourdomain.com
Игнорирование выходных данных задания Crontab
Делается это очень просто:
*/10 * * * * /home/myscript.sh > /dev/null 2>&1
Мы передаем вывод в /dev/null это специальный файл, который отбрасывает все данные (нулевое устройство, “черная дыра”).
Предупреждение
Многие скрипты исполняются в среде Bash с переменной PATH. И поэтому может случиться так, что Ваши скрипты работают в Вашей оболочке, но когда запустите в Cron (где PATH переменная отличается), скрипту не удается найти указанные исполняемые файлы и задание завершается ошибкой. Поэтому используйте в файле заданий Crontab специальную переменную PATH:
PATH=/bin/bash