Планировщики crond и atd в ubuntu

В Linux есть специальный демон — cron, позволяющий выполнять программы по расписанию. В этой статье мы научим вас пользоваться этим демоном.
Очень часто нужно периодически выполнять одни и те же действия. Например, каждый день проверять обновление антивируса (или раз в неделю — в зависимости от того, как часто выходят для него обновления) или каждые 30 минут — почту. Можно выполнять эти действия самому, но это не совсем удобно.

Представьте, что ваш рабочий день будет начинаться с команды запуска программы обновления антивируса, а каждые 30 минут вы будете вводить программу проверки почты. Во-первых, не это не очень удобно, а во-вторых, можно легко забыть выполнить ту или иную команду. Например, в пятницу вечером вы можете забыть выполнить команду создания резервной копии, а в понедельник утром что-то случится с сервером, и вы не досчитаетесь всего пользовательского каталога. Не очень приятно, правда?

В Linux есть специальный демон — cron, позволяющий выполнять программы по расписанию. Откройте конфигурационный файл демона cron — /etc/crontab
Пример файла /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don’t have to run the ‘crontab1
# command to install the new version when you edit this file.
# This file also has a username field, that none of the other crontabs do. SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user command
17 * * * * root run-parts —report /etc/cron.hourly 25 б * * * root run-parts —report /etc/cron.daily 47 6 * * 7 root run-parts —report /etc/cron.weekly 52 6 1 * * root run-parts —report /etc/cron.monthly #

Параметр SHELL задает имя программы-оболочки, параметр PATH — пусть поиска программ. Кроме этих параметров, могут также использоваться параметры MAILTO и НОМЕ. Параметр MAILTO задает имя пользователя, которому будет отправлен отчет о выполнении расписания, а НОМЕ — домашний каталог crond.
Но самое главное — не эти параметры, а собсвенно таблица расписаний. В нашем случае она выглядит так:
17 * * * * root run-parts —report /etc/сгоп.hourly 25 б * * * root run-parts —report /etc/cron.daily 47 б * * 7 root run-parts —.report /etc/cron.weekly 52 б 1 * * root run-parts —report /etc/cron.monthly

Согласно этой таблице каждый час будут выполняться программы из каталога /etc/cron.hourly, каждый день — из каталога /etc/cron.daily, каждую неделю — из каталога /etc/cron.weekly, и раз в месяц — из каталога /etc/cron.monthly.

Предположим, вам нужно каждый дець выполнять команду update_av ftp://server.ru/bases/. В каталоге /etc/cron.daily создайте файл update_av следующего содержания:
#!/bin/bash
update_av,ftp://server.ru/bases/

Мы создали небольшой bash-сценарий (сценарий командного интерпретатора). Теперь сделаем его исполнимым, и все будет готово:
# chmod +х update_av

Правда, удобно? Но иногда нам нужно создать более гибкое расписание. Например, мы хотим, чтобы одна программа выполнялась в 7 часов утра, а другая в 7:20, Тут простым добавлением сценария в каталог /etc/cron.daily уже не отделаешься. Чтобы создать такое расписание, вам нужно изучить формат записей таблицы расписаний. А формат следующий:
мин. (0-59) часы (0-23) день (1-31) месяц (1-12) день (0-6, 0-Вс) команда

Чтобы реализовать наше расписание, нам нужно добавить в /etc/crontab следующие строки:
0 7 * * * /usr/bin/commandl arguments 20 7 * * * /usr/bin/command2 arguments

Первая команда будет запускаться каждый день в 7 часов утра, а вторая команда будет запускаться тоже каждый день, но в 7:20.

Зная формат файла crontab, мы можем отредактировать стандартную таблицу расписания. Обратите внимание: команды, выполняемые ежедневно, будут запускаться в 4 часа утра. Это, конечно, удобно, но они не будут выполнены, если вы выключаете сервер на ночь. Поэтому давайте установим другое время, например, 8 часов утра:
0 8 * * * root nice -n 19 run-parts —report /etc/cron.daily

Аналогичная ситуация и с еженедельным запуском. Программы будут запущены не только в 4:22 утра, но еще и в воскресенье. На выходные вы точно выключите свой сервер (хотя это зависит от политики организации — ведь во многих организациях выключают на выходные все компьютеры). Поэтому целесообразно назначить запуск на понедельник в 8 часов 22 минуты:
22 8 * * 1 root nice -n 19 run-parts —report /etc/cron.weekly

С ежемесячным запуском вроде бы все нормально: программы будут выполняться в 4:42 первого числа каждого месяца. Хотя время можно было бы и изменить на 8:42:
42 8 1 * * root nice -n 19 run-parts —report /etc/cron.monthly

Иногда нужно просто выполнить определенные команды в определенное время (разово), поэтому редактировать таблицу crontab не совсем уместно. Данную задачу можно решить более рационально. Убедитесь, что у вас установлен и запущен демон atd. После этого введите команду
at <время> [дата]

Затем просто вводите команды, которые вы хотите выполнить в указанное время. Для завершения ввода нажмите комбинацию клавиш +. Время указывается в АМ/РМ-формате, например, если вам нужно выполнить команды в 14:00, то вы должны ввести команду:
at 2pm

Просмотреть очередь заданий можно командой atq, а удалить какое-либо задание — командой atrm.