Cron щомісяця. Cron – запуск програм користувача у вказаний час. Правильне налаштування планувальника завдань Cron

У ОС Unix існує можливість запускати програми користувача у зазначений час. Для цього використовується програма cron, яка отримує інструкції від користувачів і, виконуючи їх, виконує виконання будь-яких завдань за отриманими сценаріями. Наші клієнти можуть скористатися цією можливістю для виконання періодичних завдань.

Як налаштовувати cron у Власному кабінеті (для unix-тарифів)

Оскільки всі PHP-програми можуть працювати через CLI SAPI без попередньої модифікації, можна запускати їх через wget. Наприклад:

/usr/local/bin/wget -O /dev/null -q http://mysite.tld/cron.php?action=123

Якщо у скрипті використовуються функції require, include, причому в них вказані відносні шляхи, то на початку скрипту використовуйте виклик функції chdir(), яка задасть поточну робочу директорію

Як отримувати повідомлення про помилки від програм, що запускаються cron

Якщо при виконанні програми, яка запускається з cron, виникли помилки, напевно ви захочете отримувати повідомлення про ці помилки, щоб повністю контролювати роботу завдань, що періодично запускаються. Для цього на початку cron-сценарію розмістіть такий рядок:

MAILTO=адрес@домен.ru

Звичайно, адреса@домен.ruпотрібно замінити на реально існуючу адресу електронної пошти, куди треба буде доставляти повідомлення. Якщо потрібно отримувати повідомлення про помилки на кілька адрес, вкажіть всі ці адреси через кому.

Зверніть увагу на те, що cron буде надсилати поштою те, що виводять скрипти, що запускаються. Наприклад, якщо ви напишете скрипт, який друкуватиме рядок «Hello, world» і поставите його на виконання через cron, ви отримуватимете поштою лист з рядком «Hello, world» щоразу, коли cron запускатиме такий скрипт.

Щоб уникнути цього, наприклад, коли текст, який виводиться скриптом, вам не потрібен, треба додати в кінець рядка-сценарію для cron символи

> /dev/null 2>&1

Повністю рядок для cron виглядатиме так:

0 1 * * * /usr/local/bin/php -q $HOME/script.php > /dev/null 2>&1

Рекомендуємо перевіряти коректність синтаксису скриптів, які ви встановлюєте виконання через cron. Скрипти можуть містити помилку, можуть неоднаково працювати при запуску через веб-сервер і через cron, і таке інше. Для того, щоб переконатися, що скрипт правильно працюватиме через cron, попередньо перевірте його такою командою в unix shell:

/usr/local/bin/php -l script.php

Якщо помилок у скрипті немає, ви побачите повідомлення "No syntax errors detected in script.php".

Обмеження

Для програм, які запускаються через cron, діють такі ж обмеження по ресурсах, що споживаються, як для процесів, що запускаються користувачем в unix shell. Йдеться про обмеження на час виконання програми, кількість доступної пам'яті, обмеження на розмір файлів і так далі.

У наших матеріалах присвячених Ubuntu Server час від часу торкається питання виконання будь-яких завдань за розкладом. Щоб не пояснювати щоразу одне й теж ми вирішили створити даний матеріал, який має допомогти системним адміністраторам освоїти та ефективно використовувати планувальник завдань у Linux.

В Ubuntu Server як планувальник завдань використовується cron- планувальник із інтерфейсом командного рядка. Він є важливою частиною системи та починає функціонувати відразу після встановлення, виконуючи різні системні завдання. Наша мета – поставити його собі на службу, тим більше це не так складно, як здається.

Передбачено два типи розкладів cron: користувальницьке та системне. Відрізняються вони тим, що перше створюється користувачами і виконується з урахуванням прав користувача, друге використовується в адміністративних або системних цілях і може бути запущено від імені будь-якого користувача.

Щоб створити або змінити розклад користувача наберіть команду:

Crontab-e

При першому запуску утиліта запропонує вибрати редактор, ми рекомендуємо вибирати mcedit(вимагає встановленого mc) або інший редактор, з яким ви вмієте працювати.

Формат рядків розкладу має вигляд:

Хвилина година день місяць день_тижня команда

  • Хвилина- час у хвилинах від 0 до 59
  • Година- від 0 до 23
  • День- День місяця від 1 до 31
  • Місяць- від 1 до 12 або літерні позначення jan - dec
  • День тижня- від 0 до 6 (0 - неділя) або sat - sun
  • Команда- рядок у форматі командного інтерпретатора, який буде виконаний, допускається запис типу команда1 && команда2для запуску кількох команд поспіль.

Значення хвилин, годин, днів можна вказувати так:

  • Значення- число, що означає дату або час, допускається підстановковий знак * що допускає повний діапазон значень
  • Декілька значень- допускається вказувати кілька значень через кому, наприклад 2,14,22
  • Діапазон значень- вказується через дефіс, наприклад 2-10
  • Крок значень- вказується через дріб, знаменник якої ставиться крок, наприклад */3 - кожне третє значення 0, 3, 6, 9 і т.д. Як чисельник повинен бути діапазон значень або зірочка.

Розглянемо наступний приклад запису:

0 8-19/2 * * 1 /home/ivanov/test

Вона означає що кожну другу годину з 8 до 19 (8, 10,12,14,16) по понеділках запускати скрипт test у домашньому каталозі Іванова.

Відразу хочемо застерегти вас від поширеної помилки, при вказівці періодичного виконання всі дати повинні бути вказані явно, зірочка позначає повний діапазон значень, а не їх відсутність. Наприклад, якщо вам потрібно виконувати якийсь скрипт щогодини з 10 до 15 неправильно буде:

* 10-15 * * * /home/ivanov/test

Цей рядок призведе до запуску скрипту кожну хвилинуу діапазоні з 10 до 15 годин. Правильно буде:

0 10-15 * * * /home/ivanov/test

Цей запис дозволить запускати скрипт на початку кожної години вказаного діапазону.

Крім дати можна використовувати ряд спеціальних рядків:

  • @reboot- виконувати команду під час перезавантаження
  • @yearlyабо @annually- виконувати 1 січня, аналогічно до запису: " 0 0 1 1 * "
  • @monthly- Виконувати 1 числа кожного місяця, аналогічно " 0 0 1 * * "
  • @weekly- виконувати щонеділі, рівносильно " 0 0 * * 0 "
  • @dailyабо @midnight- щодня опівночі," 0 0 * * * "
  • @hourly- раз на годину, " 0 * * * * "

Так для щоденного виконання нашого скрипту щоночі можна написати:

@midnight /home/ivanov/test

Завершивши складання розкладу, зберігаємо файл і виходимо з редактора. Розклад користувача буде збережено в /var/spool/cron/crontabsпід назвою поточного користувача.

Для системних та адміністративних завдань передбачено файл /etc/crontabсинтаксис записів у ньому відрізняється наявністю додаткового значення - користувача, від імені якого буде запущено завдання:

Хвилина година день місяць день_тижня користувач команда

Приклад такого запису:

0 19 * * 1-5 root /etc/backup

Згідно з якою о 19:00 з понеділка по п'ятницю запускатиметься скрипт /etc/backupвід імені користувача root.

Цей файл також містить системні розклади, тому до його редагування слід підходити з обережністю. Усі системні та адміністративні завдання слід розміщувати саме у ньому.

Як бачимо cronдосить простий у використанні, але в той же час надає багаті можливості настроювання розкладів в Ubuntu Server. Сподіваємося, ця стаття допоможе адміністраторам освоїти даний інструмент.

Системним адміністраторам, та й звичайним користувачам часто доводиться автоматизувати різні завдання з обслуговування та роботи з Linux за допомогою скриптів. Це дуже зручно, ви просто запускаєте скрипт, і він робить все, що необхідно без вашого втручання. Наступний крок на цьому шляху - налаштувати автоматично запуск потрібного скрипта в потрібний час.

Саме для цих завдань Linux використовується системний сервіс cron. Це планувальник, який дозволяє виконувати потрібні вам скрипти раз на годину, раз на день, тиждень або місяць, а також у будь-який час або через будь-який інтервал. Програма часто використовується навіть іншими службами операційної системи. У цій статті ми розглянемо як виконується налаштування Cron і розберемо основні приклади, що часто використовуються.

Фактично, Cron – це сервіс, як і більшість інших сервісів Linux, він запускається при старті системи та працює у фоновому режимі. Його основне завдання виконувати необхідні процеси у потрібний час. Існує кілька конфігураційних файлів, з яких він бере інформацію про те, що і коли потрібно виконувати. Сервіс відкриває файл /etc/crontab, де вказані всі необхідні дані. Часто в сучасних дистрибутивах там прописаний запуск утиліти run-parts, яка запускає потрібні скрипти з наступних папок:

  • /etc/cron.minutely- кожну хвилину;
  • /etc/cron.hourly- кожну годину;
  • /etc/cron.daily- кожен день;
  • /etc/cron.weekly- щотижня;
  • /etc/cron.monthly- кожен місяць.

У цих папках повинні бути скрипти, які потрібно виконувати з зазначеним інтервалом. Скрипти повинні мати права на виконання та їх ім'я не повинно містити крапки. Це дуже полегшує роботу з планувальником для нових користувачів. Також у файлі crontab прописано запуск команди anacron, яка працює так само як і cron, тільки призначена для завдань, які потрібно виконувати раз на тривалий період, наприклад, раз на день, тиждень, місяць, рік.

Вона дозволяє виконувати їх навіть якщо комп'ютер працює не завжди і час від часу вимикається. Дата виконання завдання останній раз записується у файл /var/spool/anacron, а потім, при наступному запуску anacron перевіряє, чи був запущений потрібний процес у потрібний час, і якщо ні, то запускає його. Сам сервіс cron більше розрахований на виконання завдань протягом дня або з точно розписаним часом і датою.

Налаштування Cron

Для налаштування часу, дати та інтервалу коли потрібно виконувати завдання використовується спеціальний синтаксис файлу cron та спеціальна команда. Звичайно, ви завжди можете відредагувати файл /etc/crontab, але робити це не рекомендується. Натомість, є команда crontab:

Її завжди бажано виконувати з опцією -e, тоді для редагування правил буде використано ваш текстовий редактор за умовчанням. Команда відкриває вам тимчасовий файл, де вже представлені всі поточні правила cron і ви можете додати нові. Після завершення роботи команди cron файл буде оброблений і всі правила будуть додані в /var/spool/cron/crontabs/ім'я_користувача, причому додані процеси будуть запускатися саме від того користувача, від якого ви їх додавали.

Тому тут потрібно бути обережним, і якщо вам потрібно виконувати скрипти від рута, то і crontab потрібно виконати від рута, а не від користувача. Це часто спричиняє проблеми.

Синтаксис crontab

Як я вже казав, час задається особливим синтаксисом, давайте розглянемо синтаксис налаштування одного завдання cron:

хвилина година день місяць місяць_тижня /шлях/до/виконуваного/файлу

Потрібно сказати, що обов'язково потрібно писати повний шлях до команди, тому що для команд, що запускаються від імені cron змінне середовище PATH буде відрізнятися, і сервіс просто не зможе знайти вашу команду. Це друга найпоширеніша причина проблем із Cron. Дата та час вказуються за допомогою цифр або символу *. Цей символ означає, що потрібно виконувати щоразу, якщо в першому полі - щохвилини і так далі. Ну, а тепер перейдемо до прикладів.

Приклади налаштування cron

Спочатку можна переглянути завдання cron для суперкористувача, для цього можна скористатися опцією -l:

Ви можете видалити всі існуючі завдання командою -r:

Припустімо, що нам потрібно запускати від імені суперкористувача наш скрипт за адресою /usr/local/bin/serve. Якийсь обслуговуючий скрипт. Найпростіший приклад - запускати його щохвилини:

* * * * * /usr/local/bin/serve

0 * * * * /usr/local/bin/serve

Запускаємо в нульову хвилину нульової години, щодня, це о 12-й ночі:

0 0 * * * /usr/local/bin/serve

0 0 1 * * /usr/local/bin/serve

Можна в будь-який день, наприклад, 15 числа:

0 0 15 * * /usr/local/bin/serve

Першого дня тижня першого місяця року, 0 годин 0 хвилин:

0 0 * 1 0 /usr/local/bin/serve

Або в нульовий день тижня кожного місяця:

0 0 * * 0 /usr/local/bin/serve

Ви можете вибрати будь-яку хвилину, годину та день тижня, наприклад, 15.30 у вівторок:

30 15 * * 2 /usr/local/bin/serve

Понеділок вважається першим днем, неділя – це сьомий чи нульовий день. Ще можна писати скорочену назву дня тижня, наприклад sun – неділя:

30 15 * * sun /usr/local/bin/serve

Для того щоб вказати певний інтервал потрібно використовувати символ "-", наприклад, кожну годину, з сьомої ранку до сьомої вечора:

0 7-19 * * * /usr/local/bin/serve

Якщо потрібно запустити команду кілька разів, можна використовувати роздільник ",". Наприклад, запустимо скрипт у 5 та 35 хвилин п'ятого (16:05 та 16:35), щодня:

5,35 16 * * * /usr/local/bin/serve

Ви можете захотіти не вказувати окремо час, а просто вказати інтервал, з яким потрібно запускати скрипт, наприклад, раз на 10 хвилин. Для цього використовується роздільник коса риса - "/":

*/10 * * * * /usr/local/bin/serve

Крім того, для деяких наборів, що часто використовуються, були придумані змінні, ось вони:

  • @reboot- при завантаженні, лише один раз;
  • @yearly, @annually- Щороку;
  • @monthly- раз в місяць;
  • @weekly- раз на тиждень;
  • @daily, @midnight- кожен день;
  • @hourly- кожну годину.

Наприклад, ось так просто виглядатиме команда запуску скрипту раз на годину:

@hourly /usr/local/bin/serve

Якщо ж ви зібралися додати скрипт в одну з папок, то, як я вже казав, потрібно, щоб його ім'я було без крапок і мали право на виконання:

sudo vi /etc/corn.daily/basckup

Скрипт має виглядати так. Тепер ви знаєте, як налаштувати cron, залишилося перевірити як все працює.

Налагодження роботи

Після того як ви налаштували правила, ще хотілося б перевірити, чи працюють вони. Для цього чекаємо на той час, коли скрипт вже повинен бути виконаний і дивимося лог cron. Іноді він перебуває у /var/log/cron, інколи ж пишеться в syslog. Наприклад, у мене в crontab є такий рядок:

Вона має виконуватися о 19.40 щодня, тепер дивимося лог:

grep CRON /var/log/syslog

І бачимо, що в нашому лозі вона дійсно є і виконується цілком успішно. Якби були якісь помилки, то відразу було б виведено повідомлення.

Якщо потрібно перевірити скрипт, який знаходиться в одній зі спеціалізованих папок, то тут ще простіше, просто запустіть run-paths, передавши їй параметр потрібну папку або навіть сам скрипт:

sudo run-paths /etc/cron.daily/

Висновки

У цій статті ми розглянули, як виконується налаштування cron для зручного планування автоматичних завдань. Сподіваюся, що ця інформація була корисною для вас.

Я багато чув про те, що в linux є зручний планувальник задач cron. Однак, у мене не було необхідності ним користуватися, і розбиратися в його налаштуваннях не хотілося… консоль, багато англійських літер… було страшно. Але, добре, мої побоювання були марними — все просто просто. У статті буде розглянуто, як налаштувати виконання своїх скриптів за розкладом, і як приклад встановимо «зозулю».

Для початку трохи про те, як це взагалі працює.

Під час запуску системи стартує демон cron. Ним можна керувати (зупиняти/запускати/пізнавати статус) командою: sudo service cron (stop/start/status). Але це рідко, коли потрібно.

Сам демон cron більшу частину часу спить, і злегка відкриває око раз на хвилину, щоб перевірити наявність завдань на цей час. Якщо завдання відсутні, він знову йде в сплячку.

Завдання знаходяться у файлах імена, які рівні іменам користувача, а самі файли лежать у папці /var/spool/cron/crontabs. Папка захищена від стороннього втручання та доступна лише суперкористувачу. Але кожен користувач може налаштувати розклад для своїх завдань, не знаючи пароля від рута (суперкористувача).

Що б налаштувати cronдля звичайного користувача достатньо набрати:

Якщо потрібно створити завдання для іншого користувача, то запуск здійснюється командою:

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 хвилин, по понеділках то ставимо:

Якщо потрібно, щоб завдання виконувалася щогодини, то доведеться встановлювати і певну хвилину. Якщо залишити зірочку (* */1 * * *), то крон виконуватиме щохвилини — бо умови дотримані: він перевірив усі 5 осередків та їх значення відповідає поточному часу (хвилини — все одно. Годинник — щогодини, а не лише певні ).
Перед слішем завжди повинна йти зірочка. Наприклад, призначити виконання щохвилини, починаючи з 30-ої, вписавши 30/1 - не вийде.

Якщо потрібно, щоб завдання виконувалася не циклічно, але кілька разів, то значення пишуться через кому.
Наприклад потрібно виконати завдання по буднях о 12 годині дня і 6 вечора. То це виглядатиме так:

* 12,18 * * 2,3,4,5,6

Після закінчення редагування завдань не забудьте зберегти зміни (Ctrl+O > ентер), а потім можна вийти (Ctrl+x).

Cron повинен повідомити, що з'явилося нове завдання і він готовий виконувати її, написавши: «crontab: installing new crontab».

Подивитися створені завдання (може бути ви нічого і не робили для себе, а адміністратор мережі, що вам налаштував) можна командою:

І насамкінець сам скрипт зозулі, Який кукукає кожну годину:

#!/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 його можна встановити командою.

Корисним механізмом, що забезпечує контроль за виконанням процесів у linuxє планувальник завдань або cron, файл crontabу директорії etc за допомогою цього файлу додаються скрипти, завдання, які ми можемо написати для працюючої системи, наприклад, для контролю роботи linuxсистеми по e-mail

Cron- служба-демон використовується в linux/unixсистемах як планувальник завдань. Демон дозволяє періодично запускати скрипти виконання.

Створювані файли розміщуються або в директорії:
/usr/spool/cron/crontabs або /var/spool/cron/tabs
Редагувати їх потрібно лише за допомогою crontab –e
Залежно від періоду виконання файли можуть бути розміщені в директорії:
/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly

Створення завдань cron
Створення завдання у crontabвиглядає як заповнення шести обов'язкових полів, їхнє значення таке:
1. Хвилини – цифра від 0-59
2. Годинник – цифра від 0-23
3. День місяця – цифра від 1-31
4. Номер місяця на рік – цифра від 1-12
5. День тижня – цифра від 0-7
0-неділя, 1-понеділок, 2-вівторок, 3-середа, 4-четвер, 5-п'ятниця, 6-субота
Для кожного з перерахованого вище параметра може бути задані значення:
а) Через кому – 3,7,9 (у полі день місяця 3,7,9 відповідно)
б) Через дефіс – 3-9 (у полі година означатиме виконання 3,4,5,6,7,8,9)
в) * - виконуватиметься у всі можливі значення
г) / - завдання додаткових періодів завдання - */8 у полі хвилини, виконуватиметься кожну восьму хвилину

Як запустити завдання cronпід час завантаження системи. Для запуску скрипта під час завантаження системи Linuxвикористовується ключове слово reboot. Наприклад:

Крім того, можна використовувати ще такі ключові слова:
@yearly – те саме, що й 0 0 1 1 * (раз на рік)
@daily – те саме що й 0 0 * * * (щодня)
@hourly - те ж що і 0 * * * * (раз на годину)

Команди для керування crontab
- переглянути завдання для поточного облікового запису
crontab -l
- переглянути завдання потрібного облікового запису
crontab -u username -l
- Редагування cron завдань
crontab -e
- Редагування cron завдань заданого користувача
crontab -u username -e

Приклади завдань cron:
Виконати завдання о 7 ранку щодня
0 7 * * * root /home/scripts/mount.sh
Виконати завдання о 17:30 щодня
30 17 * * * root /home/scripts/mount.sh
Виконати завдання щомісяця першого числа о 0 годин 0 хвилин
0 0 1 * * root /home/scripts/mount.sh
Виконувати завдання через кожні 4 години
* * /4 * * * root /home/scripts/mount.sh
Виконати завдання під час завантаження Linux
@reboot root /home/scripts/mount.sh

Додаткове налаштування cron
Для того, щоб отримувати звіт із завдань cronможна визначити змінну MAIL на початку cronсценарію
MAIL=mail.mail.local
За замовчуванням у листі будуть присутні всі повідомлення, що виводяться сценарієм, щоб цього не відбувалося, потрібно додати в заданні cron сценарію > /dev/null 2>&1
Щоб вимкнути отримання повідомлень від cron, потрібно залишити змінну MAIL не встановленою
MAIL=” ”
Є можливість визначити шлях до файлу зі скриптом, використовуючи змінну PATH, наприклад
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/home/scripts, crontab дозволить писати в рядку параметрів завдання
@reboot root mount.sh
Запуск сриптів через cron використовуючи інтерпретатор php
* 1 * * * /usr/local/bin/php – q mount.sh > /dev/null 2>&1
/usr/local/bin/wget –O /dev/null –q http://"site.com/cron.php?action=123"