Небольшой манульчик по cron с примерами использования.
Демон crond запускается процессом инициализации init при загрузке системы. crond просыпается один раз в минуту, просматривает таблицы расписаний crontabs и запускает указанные команды при совпадении текущего времени с временем указанным в расписании.
Запускать буду простой скриптик на bash, который при запуске записывает в конец файла crontest.log текущее время.
1 2 |
#!/bin/bash echo "Current time is: $(date +%T)" >> /home/user123/crontest.log |
Как добавить cron задание?
Как занести задание на запуск скрипта в таблицу заданий crontab ? Запускается команда crontab с ключом -edit. Команда crontab -e проверяет копию .crontab файла вызвавшего её пользователя, открывает файл в текстовом редакторе (тот, что указан в переменной среды EDITOR), после изменений записывает файл в системный каталог.
1 |
crontab -e |
Формат cron задания.
Все crontab-файлы имеют один формат. Если crontab вызывается пользователем впервые, то, скорее всего, отобразится стандартный файл (содержащий небольшую справку с командами), все поля в таком файле будут со знаком комментария #. Любая строка, не начинающаяся со знака #, должна содержать шесть полей и является одной командой:
1 |
минуты часы день месяц день_недели команда |
Первые пять полей содержат информацию о времени запуска команды и отделяются друг от друга через пробел. В последнем поле содержится строка для передачи в sh, где пробелы выполняют роль аргументов.
Спецификация времени запуска команды в файле crontab.
1 2 3 4 5 6 7 8 9 |
минуты - минуты часа, диапазон 0-59 часы - часы дня, диапазон 0-23 день - день месяца, диапазон 1-31 месяц - месяц года, диапазон 1-12 день_недели - день недели, диапазон 0-6 (0 соответствует воскресенью). Также может задаваться в символьном виде, например: sun, mon, tue и т.д. |
Поля, содержащие сведения о времени запуска команды, могут состоять из одного значения или интервала значений (0-10 или sun-wed). также это может быть список отдельных значений/интервалов разделенный запятыми.
Каждое из эти полей может содержать
- Символ *, который означает любую цифру
- целое число (обозначающее конкретную минуту, час, день, месяц, день недели)
- два числа разделённых дефисом, обозначает диапазон значений
- целые числа, разделённые запятыми
Пример задания времени выполнения cron
1 |
0,30 10-23 * 2-12 0-6 /home/user123/newcron.sh |
Можно расшифровать таким образом: команда выполняется каждый 30 минут с 10 до 23 часов в любой день с февраля по декабрь в любой день недели (с понедельника по воскресенье).
Если cron не выполняет заданную команду, то ошибку следует искать либо во времени выполнения, либо ошибка в команде. Ошибку в команде отловить просто — достаточно запустить её из командной строки и посмотреть результат, далее — действовать по обстоятельствам (править пока не заработает). Если есть подозрение на ошибку во времени, то можно посмотреть лог.
Как просмотреть все cron задания?
Для просмотра всех заданий cron достаточно ввести
1 |
crontab -l |
Просмотреть все задания для конкретного пользователя
1 |
crontab -u username -l |
Как удалить cron задание?
Удалить задание из cron можно двумя путями. Первый способ — это отредактировать файл с заданиями выполнив crontab -e
Второй способ позволяет убрать из очереди все задания:
1 |
crontab -r |
Убрать все задания для конкретного пользователя
1 |
crontab -u username -r |
Как посмотреть лог выполнения cron ?
В Linux логи крона хранятся в системном журнале, который доступен по адресу
/var/log/syslog
Для просмотра строк, которые были отправлены в журнал cron’ом достаточно ввести
1 2 |
grep cron /var/log/syslog tail /var/log/syslog | grep cron |
Если cron выполнялся много раз, то список будет внушительный 🙂
Как писать логи cron в отдельный файл?
Для того, чтобы syslog писал логи cron в отдельный файл нужно открыть
/etc/rsyslog.d/50-default.conf
открыть этот файл следует через команду sudo, например, так:
1 |
sudo nano /etc/rsyslog.d/50-default.conf |
иначе (если работать в командной строке не через su) нельзя будет записать изменения.
Найти строку начинающуюся с
#cron.* -/var/log/cron.log
и убрать #, после этого сохранить файл.
Файл /var/log/cron.log — и будет местом хранения логов cron.
После этого файл нужно создать
1 |
touch /var/log/cron.log |
Далее нужно перезапустить syslog
1 |
sudo service rsyslog restart |
Теперь все логи cron будут записываться в отдельный файл
/var/log/cron.log
Как ограничить доступ пользователей к cron?
Для ограничения доступа к cron в директории /etc можно создать 2 файла (по-умолчанию они отсутствуют): cron.allow и cron.deny. Если файл /etc/cron.allow существует, то для доступа к команде crontab и cron любой пользователь (не являющийся суперпользователем root) , должен быть прописан в этом файле. Если такой файл не существует, но существует файл /etc/cron.deny, и любой пользователь указан в данном файле (не являющийся суперпользователем root), не сможет пользоваться crontab и cron. Если не существует ни того, ни другого файла, то только суперпользователь может пользоваться crontab и cron. Пустой файл /etc/cron.deny даёт возможность всем пользователям работать с cron и crontab.
Аналогичные файлы существуют для команды at — /etc/at.allow и /etc/at.deny.
Однократное выполнение задания в определённое время.
Бывает, что необходимо выполнить команду в определённое время, причём только один раз. Для этого существует утилита at.
Пример использования:
1 |
at -f newcron.sh -v 10:25 |
флаг -f — задаёт команды, которые выполнятся из файла
флаг -v — задаёт время выполнения
флаг -m — отправляет письмо пользователю, если у команды нет стандартного вывода
флаг -q — очерёдность, которая увеличивает значение nice для запускаемого процесса-задания
Время выполнения задания может быть задано следующим образом:
1 2 3 4 5 |
[alex123@ubuntu64 ~]$ at -f mycrontest.sh 10pm tomorrow [alex123@ubuntu64 ~]$ at -f mycrontest.sh 7:00 next week [alex123@ubuntu64 ~]$ at -f mycrontest.sh 22:00 july 11 |
Как отобразить запланированные задания?
Сделать это можно с помощью следующим образом:
1 |
[alex123@ubuntu64 ~]$ atq |
1 2 |
17 Thu Apr 6 02:00:00 2017 a alex123 14 Fri Apr 7 22:00:00 2017 a alex123 |
Удаление заданий
1 |
[alex123@ubuntu64 ~]$ atrm 14 |
где последнее число — это номер задания
Свежие комментарии