Як змусити cron виконувати наші накази

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

Так само як більшість інших демонів, cron запускається разом з FreeBSD і потім тихенько працює у фоновому режимі. Щоб довести собі, що немає необхідності запускати cron самостійно, пошукайте слово #xab; cron # xbb; в списку запущений процесів, наприклад таким чином:

У вас повинно вийти щось схоже:

В даному прикладі cron має 97-й номер процесу.

В результаті ви побачите наступні рядки:

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

День тижня (dayofweek)

0-7 (де 0 і 7 цієї неділі) або перші три букви англійської назви дня в тижні (реєстр не враховується)

Значення можуть бути числом, трьохлітерним назвою, а також діапазоном, наприклад запис #xab; 1-5 # xbb; в поле dayofweek означатиме #xab; з понеділка по п'ятницю # xbb ;. Значення можуть відділятися запитом: #xab; 1,15,31 # xbb; в поле dayofmonth буде запускати зазначену команду 1-го, 15-го і 31-го числа кожного місяця.

Також можна використовувати значення виду #xab; * / число # xbb ;. наприклад #xab; * / 2 # xbb; в поле місяця буде означати #xab; запускати кожен другий місяць # xbb ;. У системному списку завдань є подібний приклад:

Цей рядок читається так: виконувати команду / usr / libexec / atrun від користувача root, якщо поточна хвилина ділиться без остачі на п'ять (або просто кожні п'ять хвилин), кожну годину кожен день будь-якого місяця. Якщо ви не в курсі, що робить команда atrun, надрукуйте на консолі:

У відповідь буде сказано:

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

І заключна таблиця, перед тим як знову звернутися до / etc / crontab. Ви можете замінити всі п'ять полів часу наступними підстановками:

Повернемося в першу консоль і продовжимо читання / etc / crontab:

Тобто newsyslog призначений для додання системним журналам керованих розмірів.

Отже, читаємо / etc / crontab далі:

Де cron знаходить обслуговуючі сценарії? На другий консолі спробуйте надрукувати:

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

Якщо у вас є кілька повідомлень, то, крім іншого, ви повинні отримати як мінімум одне, назване #xab; daily run output # xbb ;, якщо ви прочитаєте це повідомлення, то ви побачите, скільки роботи проробляє для вас cron щоночі о 1:59. Зверніть увагу, що повідомлення, які стосуються безпеки, надсилаються окремим листом, яке називається #xab; security check output # xbb ;. Це повідомлення дуже корисно для прочитання, так як воно містить інформацію про перевірку файлів, що мають атрибут setuid, uid 0, користувачів без паролів, повідомленнях ядра, відкинутих спробах зареєструватися в системі та відхилених з'єднаннях.

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

До цього моменту ми досліджували системний файл crontab, який не слід змінювати. Тепер ми подивимося, як створювати свій власний файл crontab, для того щоб змусити cron виконувати наші команди. Під FreeBSD за замовчуванням будь-який користувач має право створити власний файл crontab. Ці файли зберігаються в каталозі / var / cron / tabs. Якщо ви надрукуєте (від користувача root):

Якщо я хочу знайти і видалити файли з певними розширеннями, то я можу ввести подібну команду (ви повинні ввести її на одному рядку):

Подивимося, як можна інтерпретувати цю малозрозумілу фразу. У загальному вигляді ця команда щось шукає. Пошукові вираження завжди виглядають як:

Отже, коли я пишу find /, я говорю команді find шукати від кореня файлової системи.

Далі я говорю find, що б вона шукала файли, чиї імена закінчуються на ".core" або починаються на "dead.". Так як в кінцевому підсумку я хочу що б обидва типи фалів були видалені, то я оточила їх дужками. Я додала перед дужками по зворотному слешу для того що б інтерпретатор команд не сприйняв їх на свій рахунок.

Коли find знайде такі файли, він застосує до них команду "rm -rf", зазначену в параметрі "-exec". Всякий раз, коли ви використовуєте пропозицію "-exec" в find, ви повинні закінчувати його символами "\;", інакше нічого не буде працювати. Фігурні дужки вказують exec місце, куди слід підставити інформацію знайдену find.

Спробуємо розібратися, що ми тут написали. Всі сценарії починаються ось з такої штуки:

за якої слід повний шлях до програми яка буде виконувати сценарій. Ми створили сценарій для інтерпретатора команд Bourne і вказали, що команда sh (Bourne shell) буде інтерпретувати цей скрипт:

Далі йде корисне вміст сценарію. Воно містить пропозицію #xab; якщо # xbb ;, що починається ключовим словом #xab; if # xbb; і закінчується #xab; fi # xbb ;. У першому рядку пропозиції #xab; якщо # xbb; вказується умова яке може приймати значення #xab; істина # xbb; або #xab; брехня # xbb ;:

знак #xab;! # xbb; - це операція заперечення #xab, не # xbb ;, яка дозволяє блоку #xab; if # xbb; виконуватися, коли вираз в дужках неправдиве. По суті, команда ps використовується для пошуку запущеного процесу Netscape у даного користувача. У разі відсутності такого процесу сценарій триває висновком рядка укладеної в лапки:

Далі йде безпосередньо очищення кеша Netscape, який знаходиться в домашньому каталозі користувача:

У разі, якщо у користувача існує запущений процес Netscape, інтерпретатор виходить з блоку #xab; if # xbb ;, не виконуючи пункт #xab; then # xbb ;.

Збережіть ваш сценарій. Я зберегла його під ім'ям #xab; clean # xbb ;. Ви ж можете назвати ваш сценарій так, як вам буде завгодно, проте не слід називати його ім'ям якої-небудь існуючої команди. Для перестраховки запустіть на другий консолі наступну команду:

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

то, найімовірніше ви вибрали вдале ім'я для вашого сценарію.

Після того, як ви збережете ваш сценарій, вам слід встановити у нього встановленим бітом виконання файлу:

Хорошим тоном буде створення у вашій домашній теці підкаталогу bin, в якому ви будете зберігати ваші сценарії:

І нарешті, ви повинні випробувати ваш сценарій на працездатність, перш ніж віддати його cron'у. В каталозі bin напишіть:

Якщо ви перебуваєте в іншому каталозі напишіть:

Якщо ви використовуйте інтерпретатор C-shell і отримаєте повідомлення #xab; Command not found # xbb ;, то надрукуйте:

і повторіть запуск сценарію.

Тепер ми готові до створення файлу crontab для того, щоб cron виконував наш сценарій, а так само команду find. Увійдіть у систему під звичайним користувачем. Я реєструюся під ім'ям genisis. Тепер пишіть:

Оскільки ми знаходимося в vi, натисніть клавішу #xab; ESC »і слідом символ #xab; i # xbb; для входу в режим вставки, а потім введіть цей текст:

(Зрозуміло рядки 5 і 6 це насправді один рядок).

Коли ви завтра будете перевіряти свою поштову скриньку, ви побачите два листи від cron'а з результатами діяльності записів в вашому файлі crontab. Якщо ваші команди виконалися успішно, то ви отримаєте щось схоже:

Тепер кілька фінальних зауважень щодо crontab. Якщо ви хочете побачити вміст свого файлу crontab, надрукуйте:

Якщо ви хочете змінити цей файл, знову пишіть crontab -e.

Тільки суперкористувач root має право бачити, у яких користувачів встановлені файли crontab. Увійдіть під користувачем root, і спробуйте написати наступне:

Ви повинні будете побачити новий запис з ім'ям користувача, який тільки що створив свій crontab-файл.