Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »
реклама
создание сайта на битрикс цена

Почтовая рассылка

Подписчиков: 11983
Последний выпуск: 19.06.2015

Использование CRON и команды crontab

Автор: dinggo

Названия каталогов и файлов описаны для Linux(RedHat). Для других операционных систем, названия могут отличаться, но принцип работы cron точно такой же.

Cron это программа, выполняющая задания по расписаню. Позволяет неоднократный запуск заданий. Т.е. задание можно запустить в определенное время или через определенный промежуток времени. Формат и значения полей, для пользовательских файлов crontab, будут приведены в конце статьи.

При загрузке системы, запускается демон cron и проверяет очередь заданий at и заданий пользователей в файлах crontab. При запуске, демон cron сначала проверяет каталог /var/spool/cron на наличие файлов crontab, файлы crontab имеют имена пользователей, соответствующие именам пользователей из /etc/passwd Каждый пользователь может иметь только один файл crontab, записей в файле может быть несколько.

Другими словами - файлы crontab содержат инструкции для демона cron, который запустит задание(я) описаное в файле crontab. Все файлы crontab из каталога /var/spool/cron загружаются в память, одновременно с ними загружаются файлы из /etc/cron.d После этого демон cron загружает содержимое файла /etc/crontab При стандартных настройках, содержимое /etc/crontab имеет следующий вид:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

Информация файла указывает, что:

  • содержимое каталога /etc/cron.hourly будет запускаться каждый час на первой минуте часа.
  • содержимое каталога /etc/cron.daily будет запускаться каждый день на второй минуте четвертого часа.
  • содержимое каталога /etc/cron.weekly будет запускаться каждое воскресенье на 22'ой минуте 4'го часа.
  • содержимое каталога /etc/cron.monthly будет запускаться каждый первый день месяца на 42'ой минуте 4'го часа.

SHELL=/bin/bash означает использовать для запуска команд /bin/bash , если переменная не указана, то значение будет взято из /etc/passwd для пользователя являющимся владельцем файла.

HOME=/ корневой каталог для пользователя (параметр не обязательный) При необходимости доступа к специальным свойствам интерпретатора, значения переменных SHELL и HOME можно изменить, не зависимо от того, что прописано в /etc/passwd

MAILTO=root означает кому отсылать сообщение о результате работы команд.

Все содержимое из этих каталогов будет запускаться с правами доступа пользователя root и файлы должны иметь права доступа на "выполнение" (про права доступа читай статью http://rst.void.ru/texts/chmod.txt) Поэтому перед размещением файлов в одном из этих каталогов необходимо убедиться, что сценарии не насесут вред системе.

После того, как демон cron запущен и прочел содержимое всех файлов crontab, он бездействует, просыпаясь каждую минуту и проверяя не требуется ли запуск какой-либо команды в данную минуту, или не появился ли новый файл crontab который необходимо обработать. Демон cron определяет изменения по времени модификации файлов или каталогов, такое его свойство избавляет от необходимости перезапуска демона.

Как отмечалось выше, размещение файлов для cron в каталогах

/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly

доступно только пользователю root, для использования файлов crontab пользователями, нужно использовать команду crontab. Команда служит для создания, изменения и добавления файла для демона cron

Пример

Рассмотрим пример создания файла crontab для пользователя user ,домашняя директория /home/user

Задача: запускать каждую минуту файл /home/user/mail, который будет отправлять почту

#содержимое файла mail (файл должен быть с правами на запуск! например -rwxr-xr-x)
#!/bin/bash
mess="test cron"
echo "$mess" |mutt -s "subj" -m application/octet-stream bob@server.ru

1.Создаем временный файл /home/user/test содержимое файла test такое:

SHELL=/bin/bash
MAILTO=user
0-59 * * * * /home/user/mail

2. Запускаем в терминале команду crontab /home/user/test

Все. После этого в каталоге /var/spool/cron будет создан файл "user" примерно с таким содержимым

# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/home/user/test installed on Mon Mar 29 02:31:34 2004)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
SHELL=/bin/bash
MAILTO=user
0-59 * * * * /home/user/mail

и файл /home/user/mail будет запускаться демоном cron каждую минуту.

Доступ в каталог /var/spool/cron непривилегированому пользователю закрыт, что бы посмотреть юзером "user" есть ли у него файл crontab ,достаточно набрать команду crontab -l , если файл существует-будет показано его содержимое.

Для удаления файла используется команда crontab -r

Для редактирования crontab -e

Для управления файлами crontab пользователем "root" используется синтаксис:

-------------------------
crontab -u user_name file       -создание файла crontab
-------------------------        из файла "file" для
                                  юзера "user_name"

-u означает чей crontab будет обработан, Если опция не задана, то будет обработан crontab того пользователя, который запустил команду crontab.

-------------------------
crontab -u user_name -l       -просмотр файла crontab
-------------------------       юзера "user_name"

-------------------------
crontab -u user_name -r       -удаление файла crontab
-------------------------       юзера "user_name"

-------------------------
crontab -u user_name -e       -редактирование файла crontab
-------------------------      юзера "user_name" используя
                               редактор, заданный переменной
                               окружения VISUAL или EDITOR

Формат и значения полей

Каждая команда в пользовательском файле crontab занимает одну строку и состоит из шести полей. Пользовательские файлы crontab находятся в каталоге /var/spool/cron

Общий формат команды:

------------------------------------------------
минута час день_месяца месяц день_недели команда
------------------------------------------------

Допустимые значения:
минута        от 0 до 59
час           от 0 до 23
день_месяца   от 1 до 31
месяц         от 1 до 12 (можно три буквы из названия месяца,
                          регистр не имеет значения от jan до dec)
день_недели   от 0 до 6  (0 это воскресенье, 
                          можно писать от sun до sat)

Каждое из полей даты и времени может быть обозначено символом * ,будет соответствовать любому возможному значению. Для этих полей можно указывать диапазоны значений, разделенных дефисом, например:

* 5 4-10 0-3 * echo "HELLO"    -печать HELLO в 5:00 на 4,5,6,7,8,9,10
                                дни января, февраля, марта и апреля

пошаговая запись

* */2 * * sat echo "HELLO"     -печать HELLO каждый четный час,
                                каждую субботу

равнозначная предыдущему примеру запись (списком)

* 0,2,4,6,8,10,12,14,16,18,20,22 * * sat echo "HELLO"  
                               -печать HELLO каждый четный
                                час, каждую субботу

то же самое с указанием диапазона

* 0-23/2 * * sat echo "HELLO"  -печать HELLO каждый четный
                                час, каждую субботу

59 23 31 dec * echo "Happy new year" -без комментариев :),
                                      поздравит с новым годом

Для отладки задания cron, можно перенаправить результат в файл

Пример:

0-59 * * * * /home/user/mail 2>/tmp/tmp.cron

Если при запуске команды /home/user/mail возникнут ошибки, то они будут записаны в файл /tmp/tmp.cron и вы всегда сможете узнать причину. В случае перенаправления вывода в файл, письмо, юзеру указаному в переменной MAILTO отправлено не будет.

Посмотреть информацию о всех командах запускаемых демоном cron можно в каталоге /var/log называются cron, cron1 и т.д.

В файле /var/log/cron записано время запуска всех заданий cron за предыдущий день

Mar 29 04:03:00 rst CROND[4434]: (user) CMD (/home/user/mail) 
Mar 29 04:03:59 rst CROND[4493]: (user) CMD (/home/user/mail) 
Mar 29 04:05:00 rst CROND[4507]: (user) CMD (/home/user/mail) 
Mar 29 04:06:00 rst CROND[4549]: (user) CMD (/home/user/mail) 

В остальных файлах cron1,cron2 находится подобная информация, но более старая чем в cron

Вот практически и все, что требуется знать для использования cron и crontab.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
96K
24 ноября 2015 года
tatjana.grigorkina
0 / / 24.11.2015
+8 / -6
Мне нравитсяМне не нравится
24 ноября 2015, 19:50:42
Можете сказать, что я неудачник, но благодаря статье я случайно грохнула кронтаб :)
Потому что таблица с опциями в статье визуально плохо читается. Разделили бы хоть цветом строчки, хоть бордером, что угодно, чтобы они не были настолько идентичными.
А пока они визуально идентичны, получилось, что я прочитала описание от -l для -r
Теперь можно начинать громко ржать :)
2.
84K
27 июля 2012 года
Wanderer1
0 / / 27.07.2012
+8 / -37
Мне нравитсяМне не нравится
27 июля 2012, 21:37:13
Это для владельцев сервера, а я владелец сайта. Мне то что делать?
3.
84K
17 июня 2012 года
Sanja7
0 / / 17.06.2012
+3 / -10
Мне нравитсяМне не нравится
17 июня 2012, 11:55:34
Интересует такой вопрос: может ли cron запускать программы, а не скрипты или открывать текстовые файлы? Какой для этого должен быть синтаксис команды? Если не трудно приведите пожалуйста пример с одноразовым выполнением задания.
4.
68K
18 января 2011 года
d1one
0 / / 18.01.2011
+9 / -6
Мне нравитсяМне не нравится
18 января 2011, 23:37:15
0-59 * * * * echo "hello!"

вот это содержимое файла планировщика..
если я правельно понел, должен выводить каждую минуту hello
но ничего не происходит!
Сделал так crontab -e
через nano ввёл 0-59 * * * * echo "hello!"
сохранил. crontab -l убедился что присутствуют строки.
но сообщение не выводится..
4.1.
82K
11 апреля 2012 года
Poperec
0 / / 11.04.2012
+5 / -2
Мне нравитсяМне не нравится
11 апреля 2012, 18:12:49
Сообщение выводится не на экран, а на почту.
Напишите
0-59 * * * * date >> hello.txt; echo "hello!" >> hello.txt
и увидите в файле записи через каждую минуту.
5.
66K
25 ноября 2010 года
MegaLite
0 / / 25.11.2010
+5 / -3
Мне нравитсяМне не нравится
25 ноября 2010, 22:20:56
А man 5 crontab докплотнил знания)))
6.
55K
19 ноября 2009 года
anxiety
0 / / 19.11.2009
+4 / -3
Мне нравитсяМне не нравится
19 ноября 2009, 12:20:39
Возник впорос со следующими строчками:


* */2 * * sat echo "HELLO" -печать HELLO каждый четный час,
каждую субботу


Получается что данный скрпит будет выполняться КАЖДУЮ МИНУТУ(!!!)каждого четного часа, каждую субботу?

Те, какгбе, надо указывать минуту все-таки.
7.
42K
13 сентября 2008 года
realbustard
0 / / 13.09.2008
+3 / -4
Мне нравитсяМне не нравится
29 октября 2009, 17:14:43
Спасибо за отличную статью, полностью согласен с Andrus
8.
1.9K
20 декабря 2002 года
MNikolay
16 / / 20.12.2002
+2 / -4
Мне нравитсяМне не нравится
27 февраля 2008, 21:55:07
to Ed Skyline / 28 ноября 2007, 17:33:49


01 * * * * root run-parts /etc/cron.hourly

содержимое каталога /etc/cron.hourly будет запускаться каждый час на первой минуте часа.
9.
34K
28 ноября 2007 года
Ed Skyline
0 / / 28.11.2007
+4 / -2
Мне нравитсяМне не нравится
28 ноября 2007, 17:33:49
Как будет выполнятся
*/45 * * * * echo "HELLO"
Каждую 45 минуту часа? то есть 0:45 1:45 2:45
или через каждые 45 минут 0:45 1:30 2:15
если будет выполнятся по первому варианту, то как нужно задать команду, что крон выполнялся через каждые 45 минут (по второму варианту) ???
10.
32K
30 августа 2007 года
passer-by
0 / / 30.08.2007
+3 / -4
Мне нравитсяМне не нравится
30 августа 2007, 12:01:13
> Допустимые значения:
> минута от 0 до 59
> час от 0 до 23
> день_месяца от 1 до 31
> месяц от 1 до 12 (можно три буквы из названия месяца,
> регистр не имеет значения от jan до dec)
> день_недели от 0 до 6 (0 это воскресенье,
> можно писать от sun до sat)

...

> * 5 4-10 0-3 * echo "HELLO" -печать HELLO в 5:00 на 4,5,6,7,8,9,10
> дни января, февраля, марта и апреля

Так месяцы нумеруются начиная с 0 или с 1? Если с 1, то этот пример должен выглядеть так:

* 5 4-10 1-4 * echo "HELLO"
10.1.
48K
26 марта 2009 года
ded-mazay
0 / / 26.03.2009
+7 / -1
Мне нравитсяМне не нравится
29 ноября 2011, 11:19:42
вроде звездочка впереди грит каждую минуту с 5 до 6 ч. еще, но это суть не важно - в статье синтаксис показывается, а не орфография.. )
11.
29K
14 мая 2007 года
gil
0 / / 14.05.2007
+2 / -2
Мне нравитсяМне не нравится
14 мая 2007, 04:59:28
Хорошая статья. Стало понятно много из работы cron'а.
Побольше бы таких :)
12.
27K
26 февраля 2007 года
zluk
0 / / 26.02.2007
+1 / -3
Мне нравитсяМне не нравится
26 февраля 2007, 19:19:09
+1
ввосторге!
13.
Аноним
+2 / -2
Мне нравитсяМне не нравится
24 апреля 2006, 15:18:15
Плотная статья. Очень помогла
14.
Аноним
+4 / -3
Мне нравитсяМне не нравится
20 марта 2006, 06:53:01
Осознал статью.... меру...степень....глубину....
Огромное спасибо, понадобилась в нужный момент!
15.
Аноним
+5 / -3
Мне нравитсяМне не нравится
22 января 2006, 10:52:31
xorosho bilo bi esli raskrili i abiasnili sluchai kogda adna komanda rabotaet i do evo zavershenia nachinaetsa btaroi cikl
16.
Аноним
+0 / -4
Мне нравитсяМне не нравится
14 декабря 2005, 14:47:43
Все гениальное просто.
С nix'ами работаю давно, но вот как-то никогда не использовал crontab как команду, просто вносил в /etc/crontab, а тут вот понадобилось.
Поискал что есть в гугле и вылез на эту статью.
Респект огромный, мало встретишь в инете качественных описаний, но эта статья несомненно относиться к ним.
Написано так что поймет человек впервые услышавший о демоне cron.
17.
Аноним
+2 / -4
Мне нравитсяМне не нравится
11 ноября 2005, 13:13:02
Спасибо очень помогло сам бы не разобрался
18.
Аноним
+0 / -3
Мне нравитсяМне не нравится
3 ноября 2005, 17:12:17
Да ваще! Постаралась девочка на славу!
19.
Аноним
+1 / -2
Мне нравитсяМне не нравится
24 октября 2005, 08:16:32
мдя...
присоединяюсь к прокоментировавшим :)
20.
Аноним
+1 / -2
Мне нравитсяМне не нравится
11 октября 2005, 02:33:13
Спасибо за статью!
понятно изложил
21.
Аноним
+6 / -5
Мне нравитсяМне не нравится
30 сентября 2005, 17:50:24
Хорошо написано.
22.
Аноним
+8 / -1
Мне нравитсяМне не нравится
22 сентября 2005, 10:04:39
Спасибо автору за простой и доходчивый ман по крону.
Кто-то улыбнется и подумает "чайник" =) Но я совсем не прохаванный НИКСоид, поэтому мну эта статья помогла.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог