3. Запуск команд за розкладом

3.1. crontab: Повідомлення чи редагування вашого файла crontab

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

  • -l: виведення вашого поточного файла crontab;

  • -e: редагування вашого файла crontab;

  • -r: видалення вашого поточного файла crontab;

  • -u <користувач>: застосування однієї з названих вище опцій для <користувача>. Це може зробити лише root.

Давайте почнемо з редагування crontab'а. Якщо ви введете команду crontab -e, перед вами виявиться ваш улюблений текстовий редактор, якщо вас у встановлено змінну оточення EDITOR чи VISUAL, в протилежному випадку буде використано Vi. Рядок у файлі crontab складається з шести полів. Перші п'ять полів - це інтервали часу в хвилинах, годинах, днях місяцю, місяцях і днях тижня відповідно. Шосте полі - це виконувана команда. Рядки, які розпочинаються з # - це коментарі, вони ігноруються демоном crond (програмою, яка відповідає за виконання завдань з crontab). Цей формат дещо відрізняється для системного crontab'а (файл /etc/crontab). В ньому в якості шостого поля виступає ім'я користувача, яке буде використано для запуску програми з сьомого поля. Цей файл має використаний тільки для завдань адміністрування і для запуску завдань користувачів, які існують для забезпечення безпеки системи (такі як користувач демона антивірусу чи користувач для запуску серверу баз даних). Ось приклад файла crontab:

[Примітка]Примітка

Для того, щоб надрукувати його зручним для читання шрифтом, ми мусили розірвати довгі рядки. Тому деякі ділянки коду мають бути набрані з одному рядку. Коли рядок закінчується знаком \, це означає, що рядок має продовження. Ця угода працює в файлах Makefile, в shell'е, а також інших контекстах.

# Якщо ви не хочете отримувати пошту, просто 
#   закоментуйте наступний рядок
#MAILTO="ваша_електронна_адреса"
#
# Повідомлення кожні 2 дні про нові зображення о 14:00, 
#   з прикладу вище - після чого виконання "retouch"
#   для файла "stamp". Знак "%" означає 
#   новий рядок, що дозволяє вам вказувати кілька команд 
#   в одному рядку.
0 14 */2 * *  find /shared/images              \
  -cnewer /shared/images/stamp                 \
  -a -iregex ".*\.jpe?g"             \
  -a -not -regex                               \
    ".*/old/.*"%touch /shared/images/stamp
#
# Програвання мелодії кожного Різдва :)
0 0 25 12 * mpg123 $HOME/sounds/merryxmas.mp3
#
# Кожен вівторок в 17:00 виведення списку покупок...
0 17 * * 2 lpr $HOME/shopping-list.txt

Існує кілька способів вказівки інтервалів, крім тих, що ми продемонстрували в цьому прикладі. Ви можете вказати набір дискретних значень, розділених комами (1,14,23) або діапазон (1-15), або навіть комбінувати їх (1-10,12-20), а можна і з деяким кроком (1-12,20-27/2). Тепер вашим завданням буде знайти корисні команди і помістити їх у цей файл!

3.2. at: Виконання команди за розкладом, але тільки один раз

Можливо ви хотіли б виконати якусь команду у певний день, але тільки один раз. Наприклад, потрібно нагадати собі про сьогоднішню зустріч в 18:00. Ви працюєте в X, у вас встановлено пакет X11R6- contrib і ви хотіли б отримати нагадування, скажімо, у 17:30 про те, що час виходити. Тоді at - це саме те, що потрібно:

$ at 5:30pm
 # Тепер перед вами запрошення "at"
at> xmessage "Time to go now! Appointment at 6pm"
 # Натисніть CTRL-d для виходу
at> <EOT>
job 1 at 2005-02-23 17:30
$

Вказувати час можна різними способами:

  • now +<інтервал>: означає нині + інтервал (Не обов'язковий. Відсутність інтервалу означає негайне виконання). Синтаксис для інтервалу: <n>(minutes|hours|days|weeks|months). Тут minutes - хвилини, hours - години, days - дні, weeks - тижні й months - місяці. Наприклад, ви можете вказати now + 1 hour (через одну годину), now + 3 days (через три доби) і так далі.

  • <time><day>: повна вказівка дати. Опція <time> (час) є обов'язковою. Її формат для at досить вільний: ви, наприклад, можете запровадити 0100, 04:20, 2am, 0530pm, 1800 чи одне з трьох спеціальних значень: noon (південь), teatime (час вечірнього чаю о 16:00) чи midnight (північ). Опція <day> (день) є необов'язковою. Ви також можете вказати її різними способами: наприклад, 12/20/2004, що відповідає двадцятому грудня 2004 року, чи за європейським стандартом, 20.12.2004. Ви можете не вказувати рік, але тоді допускається лише європейська форма запису: 20.12. Також ви можете записати місяць літерами: і Dec 20, і 20 Dec будуть правильні.

Також at допускає використання різноманітних опцій:

  • -l: виводить список завдань, які стоять у черзі на виконання. Перше поле уявляє собою номер завдання. Це еквівалент команди atq.

  • -d <n>: видаляє з черги завдання під номером <n>. Ви можете отримати номери завдання за допомогою команди atq. Це еквівалент команди atrm <n>.

Як звично для одержання додаткової інформації дивіться сторінку керівництва для at(1).