[SHELL] Логи для скриптов

Когда мы пишем скрипт, состоящий только из команд, которыми мы хотим добиться исполнения нашего алгоритма, интерпритатор shell, будет выдавать только ошибки при их выполнении. Однако, есть разные пути, для реализации режима отладки программ, а также создания файла-лога, в который будут писаться нужные нам действия нашего скрипта. Для примера придумаем себе задачу.

Задача

Ежеминутно копировать файл из директории /usr/dir1 в директорию /usr/dir2, и выводить это в лог файл.

Решение

Собственно задача до безобразия простая. Написать скрипт, который будет копировать файл можно за минуту. Мы знаем, что команда для копирования файлов в shell cp. Потому, сделав cp /usr/dir1/* /usr/dir2 мы скопируем все файлы в нужный каталог. Но как мы узнаем о том, что это уже произошло? Ведь главное преимущество UNIX-систем заключается в том, что человек командует этой ОС, а не ОС человеком. Соответственно, мы хотим видеть всё, что происходит в нашей системе.

Как нам известно, имеется три файловых дескриптора:

  • стандартный ввод
  • стандартный вывод
  • стандартный вывод ошибки

Можно, конечно, открыть и другие потоки вывода. Shell имеет богатые средства для манипулирования ими. Итак вот они (file - это файл, в который мы будем писать сообщения из скрипта):

  • >file - Перенаправление стандартного вывода в файл file
  • >>file - Перенаправление стандартного вывода в file, но при этом старые записи удаляться не будут,. Новые записи будут добавлять к старым в конец файла
  • <file - Перенаправление стандартного ввода из файла file
  • proc1|proc2 - Перенаправление стандартного вывода процесса proc1 на стандартный ввода proc2
  • n>file - Перенаправление дескриптора с номером n в файл file
  • n>>file - То же самое, но с добавление в конец файла
  • n<&n2 - Слияние потоков с дескрипторов n1 и n2
  • <<string - Ввод до подстроки string (<<ввод здесь>>)

Собственно вся необходимая нам информация, которой мы будем оперировать есть, теперь осталось внедрить нашу задачу в жизнь. Итак, мы хотим видеть, как происходило копирование файла из одной директории в другую. Для этого создаём файл и делаем его исполняемым скриптом. Как это делать рассказано в прошлой теме. Читать прошлую тему

Кстати, могу заметить, что шебанг #!/bin/sh справедлив и для оболочки ~bash. Обычно в ~bash делается символическая ссылка и шебанг #!/bin/sh равнозначен #!/bin/bash.

Итак, вот код нашего скрипта: каким бы он был, если бы мы кроме копирования ничего от него не требовали бы:

#!/bin/sh
cp /usr/dir1/*
/usr/dir2

Всё. Больше ничего писать не надо, и мы могли бы оставить так, но нам нужно протоколировать этот процесс. Для этого вносим дополнения в скрипт, чтобы знать, что скрипт действительно выполнился:

echo "Сообщение" >>/usr/logs/file

и после этого, каждый раз, когда скрипт будет выполняться, в нашем файле лога (/usr/logs/file) будут появляться новые записи.

Итак, скрипт теперь будет выглядить вот так:

#!/bin/sh
echo "Начинаем копирование файла" >> /usr/logs/file
cp /usr/dir1/* /usr/dir2
echo "Скрипт выполнен и остановлен">> /usr/logs/file
cd /usr/dir2
ls >> /usr/logs/file

Теперь, если мы поместим файл скрипта в cron, где укажем ему запускаться каждую минуту, и открыв файл /usr/logs/file с помощью команды tail -f, то бишь # tail -f /usr/logs/file, в нашем окне будет видно, как происходит копирование файлов из директории /usr/dir1 в директорию /usr/dir2 с уведомлением о том, что скрипт запущен и остановлен. Если при копировании возникнет какая-то ошибка и файл скопирован не будет, то вы не увидите последней строки, а значит, скрипт отработал не до конца и в какой-то строке ошибка.

Последняя строка покажет нам, что находится в каталоге, в который мы копировали. Для более подробного процесса логирования можно применить оператор test и применить конструкцию выбора if-fi, но о них позже напишу. Оператор test умеет анализировать файлы и каталоги. А на основе результата анализа можно будет делать выбор.

Таким образом, всё что ты хочешь логировать в каком-то файле, можешь реализовать это с помощью дескриптора >>.

Через месяц, когда файл станет огромен, мы его заархивируем с помощью другого скрипта, и почистим для новых записей. Всё это также реализуется на скриптах. Тут уже включайте свою фантазию, как это сделать :)

Я показал понятный пример использования логирования наших скриптов. Остальное ты должен узнать сам, как делать, так как простой "копи-паст" не желателен. Теперь только я могу делать "копи-паст" из этой статьи :)

Удачи тебе, начинающий сисадмин :)




Ссылки:

К содержанию

© Copyright 2004-2017 - CMS Made Simple
Сайт работает на CMS Made Simple version 1.4.1

© Все печеньки Break-people.ru принадлежат авторам проекта.

Яндекс цитирования Рейтинг@Mail.ru Яндекс.Метрика