Fork me on GitHub

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

Что такое планировщик Cron можно прочесть из wiki либо из документации man cron

Сам планировщик разбит на основной системный кронтаб и дополнительные Внимание основной системны файл расписаний нельзя править т.к. он затирается при каждом обновлении (по крайней мере просит это сделать и если рука дрогнет то ...) Выглядит это /etc/crontab примерно так

Linnux

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

#m  h       dom     mon     dow     user    command
17  *       *       *       *       root    cd / && run-parts --report /etc/cron.hourly
25  6       *       *       *       root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47  6       *       *       7       root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52  6       1       *       *       root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#

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

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

FreeBSD

# /etc/crontab - root's crontab for FreeBSD
#
# $FreeBSD: releng/10.2/etc/crontab 194170 2009-06-14 06:37:19Z brian $
#
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
#
#minute     hour    mday    month   wday    who             command
#
*/5         *       *       *       *       root            /usr/libexec/atrun
#
# Save some entropy so that /dev/random can re-seed on boot.
*/11        *       *       *       *       operator        /usr/libexec/save-entropy
#
# Ротация логов.
0           *       *       *       *       root            newsyslog
#30         *       *       *       *       root            /usr/local/sbin/logrotate /usr/local/etc/logrotate.conf
#Вот так делать ненадо :) и логротацию надо запихнуь через crontab -e
#
# Perform daily/weekly/monthly maintenance.
1           3       *       *       *       root            periodic daily
15          4       *       *       6       root            periodic weekly
30          5       1       *       *       root            periodic monthly
#
# Adjust the time zone if the CMOS clock keeps local time, as opposed to
# UTC time.  See adjkerntz(8) for details.
1,31        0-5     *       *       *       root    adjkerntz -a

Solaris немного не так как в остальных ОС

pkg search cron
INDEX      ACTION VALUE            PACKAGE
basename   dir    var/cron         pkg:/SUNWcs@0.5.11-2015.0.2.15440
basename   dir    var/spool/cron   pkg:/SUNWcs@0.5.11-2015.0.2.15440
basename   dir    var/spool/cron   pkg:/print/lp@0.5.11-2015.0.2.15440
basename   dir    var/spool/cron   pkg:/system/accounting/legacy@0.5.11-2015.0.2.15440
basename   file   etc/default/cron pkg:/SUNWcs@0.5.11-2015.0.2.15440
basename   file   usr/sbin/cron    pkg:/SUNWcs@0.5.11-2015.0.2.15440
basename   link   etc/cron         pkg:/SUNWcs@0.5.11-2015.0.2.15440
basename   link   usr/lib/cron     pkg:/SUNWcs@0.5.11-2015.0.2.15440
  • SHELL=/bin/sh указываем какой shell использовать
  • HOME=/ где запускать всё
  • MAILTO=root кто будет получать письма счастья от крона
/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly

Для своего удобства я делаю так

#
#[минуты] (0-59)
#|  [часы] (0-23)
#|  |       [числа месяца] (1-31)
#|  |       |       [месяцы] (1-12)
#|  |       |       |       [дни_недели] (0-6 with 0=Sun)
#|  |       |       |       |       [юзер] (в системнок кроне)
#|  |       |       |       |       |[команда]
#|  |       |       |       |       ||
@reboot /bin/echo -e "P 1 F P 1 F P 1 F" > /dev/speaker
30  *       *       *       *       /usr/local/sbin/logrotate /usr/local/etc/logrotate.conf
#0  3       *       *       *       /usr/sbin/freebsd-update cron install
0   4       *       *       *       /usr/sbin/portsnap cron update > /dev/null 2>&1
#30 4       *       *       *       /usr/sbin/pkg_version -vIL=
30  *       *       *       *       /usr/local/www/lightsquid/lightparser.pl > /dev/null 2>&1
#30 6-20    *       *       *       /scripts/sarg.sh > /dev/null 2>&1
35  1       *       *       *       /usr/local/sbin/squid -k rotate > /dev/null 2>&1
#EOF



Задача: запускать каждую минуту файл /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.

Comments