Автор: Лукас Вестерман (Lucas Westermann)

В этой статье мы рассмотрим автоматизацию ежедневных рутинных действий и создадим рабочее решение для резервного копирования. Во-первых, «сценарий bash» — это сценарий, состоящий из обычных команд bash и некоторых операторов, которые нечасто используются в командной строке (условия if-then-else, циклы while и т.д.), а cron — это демон (фоновая служба), который выполняет команды, перечисленные в пользовательском файле crontab (поэтому если вам нужно запустить задачу, требующую прав суперпользователя, то редактировать следует файл crontab, принадлежащий пользователю root). Мы будем использовать простой сценарий (всего в одну строчку), который объединяет в один текстовый файл все файлы .java из одного каталога. Вы можете изменить сценарий, например, для объединения файлов журналов. Я объясню, как он работает, а затем расскажу, как настроить cron, чтобы сценарий запускался каждые 6 часов. Я предпочитаю создавать сценарии в редакторе nano, но если вам удобнее пользоваться текстовым редактором с графическим интерфейсом, просто замените «nano» на «gedit» (без кавычек). Введите команду:

nano FileCondenser

В терминале откроется редактор nano с совершенно пустым файлом. Введите следующие строки (скоро я их поясню):

#!/bin/bash find $HOME/workspace/Year\ 11 -name '*.java'  | while read line; do cat "${line}"; done

Чтобы сохранить файл, нажмите Ctrl+X и Enter. Чтобы сделать его исполняемым, выполните следующую команду:

chmod +x FileCondenser

Теперь сценарий можно запустить (строчка #!/bin/bash в начале сценария указывает на программу, которую Ubuntu должна вызвать для его обработки), выполнив в терминале:

./FileCondenser

или создав символьную ссылку в /usr/bin (тогда сценарий можно будет запускать, как любую другую программу):

sudo ln -s /<путь к сценарию>/FileCondenser /usr/bin/FileCondenser

Замените <путь к сценарию> на полный (как того требуют символьные ссылки) путь к свежесозданному сценарию.

Основа сценария — команда find, которая находит в каталоге eclipse все файлы, оканчивающиеся на .java. Затем вывод команды find передаётся циклу while, который в свою очередь построчно считывает найденные файлы и последовательно выводит строки, до тех пор, пока они не закончатся.

Как я уже говорил, можно изменить путь в сценарии, например, на /var/log/:

find /var/logs/ -name “*.log”|while read line; do cat “${line}”; done

Этот вариант сценария сольёт воедино все файлы .log из каталога /var/log/ (и подкаталогов) и отобразит результат в терминале. Или же можно перенаправить вывод в файл.

Чтобы теперь добавить сценарий в файл crontab, я предложил бы создать символьную ссылку, чтобы команда была короче. Но это не обязательно. Запустите редактор файла crontab:

crontab -e

Откроется файл crontab текущего пользователя. Если вы хотите редактировать crontab пользователя root (для сценариев резервного копирования и т.д.), запустите:

sudo crontab -e root

Важно помнить, что crontab использует определённый формат записей: <минута> <час> <день> <месяц> <день недели> <команда>. Каждой позиции должно соответствовать какое-то выражение, в роли которого может выступать числовое значение, символ подстановки или их комбинация. Например:

Каждые 5 минут:

*/5 * * * * FileCondenser > $HOME/condenseFile.txt

Каждое воскресенье в 6 вечера:

00 18 * * sun FileCondenser > $HOME/condenseFile.txt

Для периодического резервирования журналов я бы предложил такую запись:

* */2 * * * FileCondenser > $HOME/condenseFile.txt

Таким образом, сценарий будет запускаться раз в два часа, а результат будет храниться в вашей домашней папке в файле condenseFile.txt. Наконец, приведу пример простого сценария для резервного копирования. Этот сценарий архивирует определённый каталог или несколько каталогов (например, вашу домашнюю папку или каталог root) на резервный раздел или на внешний жёсткий диск:

tar cvvzf /media/Backup/Music\ Backup/backup.tar.gz $HOME/Music

Предполагается, что ваш жёсткий диск или резервный раздел смонтирован в /media/Backup и на нём есть каталог «Music Backup». Команда tar запаковывает ваш каталог Music в tar-архив backup.tar.gz, сжатый при помощи gzip, и помещает его в каталог /media/Backups/Music Backup/. Можно запускать эту команду из crontab и без сценария, но если вы собираетесь делать резервирование всей системы (или, допустим, раздела root), то вы наверняка захотите указать длинный список каталогов, которые не нужно обрабатывать (возможно, этот список будет храниться в отдельном файле). Так что с использованием сценария это будет просто аккуратнее. Более того, сценарий можно запросто запустить из терминала. Я рекомендую всегда тестировать команды или сценарии на небольшом тестовом каталоге, прежде чем добавлять их в crontab, иначе можно столкнуться с проблемами.

Lucas научился всему, что знает, ломая систему, которую потом приходится учиться восстанавливать. Когда есть время, он также ведёт блог http://lswest-ubuntu.blogspot.com

http://lswest.pastebin.com/f21a592a4 — Для тех, кто заинтересовался, версия сценария на языке Python

http://www.linux.org/docs/ldp/howto/Bash-Prog-Intro-HOWTO.html — Учебник по созданию сценариев bash

http://www.clickmojo.com/code/cron-tutorial.html — Руководство по cron