Я многое слышал о том, что в linux есть удобный планировщик задач cron. Однако, у меня не было необходимости им пользоваться, и разбираться в его настройки не хотелось… консоль, много английских букавок… было страшно. Но, благо, мои опасения были напрасны — всё до элементарного просто. В статье будет рассмотрено, как настроить выполнение своих скриптов по расписанию, и в качестве примера установим «кукушку».
Для начало немного о том, как это вообще работает.
При запуски системы стартует демон cron. Им можно управлять (останавливать/запускать/узнавать статус) командой: sudo service cron (stop/start/status). Но это редко, когда бывает нужно.
Сам демон cron большую часть времени спит, и слегка приоткрывает глаз раз в минуту, что бы проверить наличие заданий на это время. Если задания отсутствуют, то он опять уходит в спячку.
Задания находятся в файлах имена которые равны именам пользователя, а сами файлы лежат в папке /var/spool/cron/crontabs. Папка защищена от постороннего вмешательства и доступна только суперпользователю. Но, каждый пользователь может настроить расписание для своих задач, не зная пароля от рута (суперпользователя).
Что бы настроить cron для обычного пользователя достаточно набрать:
crontab -e
Если нужно создать задачу для другого пользователя, то запуск производится командой:
sudo crontab -u user -e
Заместо юзера пишем нужного пользователя, например root.
При первом запуске будет вопрос о редакторе… мне нравится nano. Он простой и запускается без графического интерфейса.
Синтаксис для задач очень прост. Рассмотрим пример со скриншота по запуску кукушки:
0 */1 * * * /home/zegi/bin/kuku
Всего в задаче 2 основных поля: 0 */1 * * * — обозначает время, когда будет срабатывать команда. А /home/zegi/bin/kuku — путь к скрипту в котором описана команда(ы).
С адресом к скрипту не должно быть проблем (zegi — это имя пользователя… не забудьте поставить своё). Но нужно пояснить, как задать крону время для выполнения скрипта.
Всего у нас 5 ячеек для ввода, которые разделяются пробелом.
1 — минуты (числа от 0 до 59)
2 — часы (от 0 до 23)
3 — день месяца (от 1 до 31)
4 — месяц в году (от 1 до 12… например февраль это 2)
5 — день в недели (от 1 до 7. Используется западная неделя, когда началом является воскресенье. т.е. ВС-1, ПН-2, ВТ-3, СР-4, ЧТ-5, ПТ-6, СБ-7).
Каждая ячейка обязательна должна быть заполнена. Если нужно, что бы команда выполнялась каждый месяц, то ставим * в 4-ом поле. Тоже самое относится и к остальным полям.
Вернёмся к примеру с кукушкой, когда скрипт срабатывает каждый час. Что бы задать периодичность используется /. Например если нужно, что бы задача выполнялась каждых 5 минут, по понедельникам то ставим:
*/5 * * * 2
Если нужно, что бы задача выполнялась каждый час, то придётся устанавливать и определённую минуту. Если оставить звёздочку(* */1 * * *), то крон будет выполнять каждую минуту — ибо условия соблюдены: он проверил все 5 ячеек и их значение соотвтествует текущему времени (минуты — всё равно. Часы — каждый час, а не только определённые).
Перед слешем всегда должна идти звёздочка. Например, назначить выполнение каждую минуту, начиная с 30-ой, вписав 30/1 — не получится.
Если нужно, что бы задача выполнялась не циклично, но несколько раз, то значения пишутся через запятую.
Например нужно выполнить задачу по будням в 12 часов дня и 6 вечера. То это будет выглядеть так:
* 12,18 * * 2,3,4,5,6
По окончанию редактирования задач, не забудьте сохранить изменения (Ctrl+O > энтер), а затем можно выйти (Ctrl+x).
Cron должен оповестить, что появилась новая задача и он готов её выполнять, написав: «crontab: installing new crontab».
Посмотреть созданные задачи (может быть вы ничего и не делали для себя, а администратор сети, что нибудь вам настроил) можно командой:
crontab -l
И в конце сам скрипт кукушки, который кукукает каждый час:
#!/bin/bash
h=`date +%l`
while [ $h -gt 0 ]
do
play ~/kukushka.wav
h=$[$h-1]
done
Скачать звук с кукушкой можно командой:
wget http://dl.dropbox.com/u/24844052/tuksik/kukushka.wav
Play входит в пакет sox. В ubuntu его можно установить командой:
sudo apt-get install sox
Спасибо было интересно почитать, теперь и мне не страшен cron. Отдельное спасибо за кукушку.
Нужно еще не забыть в конце списка заданий создать пустую строку нажав Enter, иначе будет вываливаться ошибка
new crontab file is missing newline before EOF, can’t install и файл задания не будет создан.
А так хорошее описание, плюсик автору