SHELL Логи для скриптів
Коли ми пишемо скрипт, що складається тільки з команд, якими ми хочемо домогтися виконання нашого алгоритму, інтерпретатор shell видаватиме лише помилки при їх виконанні. Однак, є різні шляхи для реалізації режиму налагодження програм, а також створення файлу-лога, в який будуть писатися потрібні нам дії нашого скрипта. Наприклад придумаємо собі завдання.
Щохвилини копіювати файл із директорії/usr/dir1 в директорію/usr/dir2, і виводити це в лог файл.
Власне завдання до неподобства просте. Написати скрипт, який копіюватиме файл можна за хвилину. Ми знаємо, що команда копіювати файли в shell cp . Тому, зробивши cp /usr/dir1/* /usr/dir2, ми скопіюємо всі файли в потрібний каталог. Але як ми дізнаємося, що це вже сталося? Адже головна перевага UNIX-систем у тому, що людина командує цієї ОС, а чи не ОС людиною. Відповідно ми хочемо бачити все, що відбувається в нашій системі.
Як нам відомо, є три файлові дескриптори:
- стандартне введення
- стандартний висновок
- стандартний висновок помилки
Можна, звісно, відкрити інші потоки вывода. Shell має багаті засоби для маніпулювання ними. Так ось вони (file - це файл, в який ми писатимемо повідомлення зі скрипту):
- >file - Перенаправлення стандартного виведення у файл file
- >>file - Перенаправлення стандартного виведення в file, але при цьому старі записи видалятися не будуть. Нові записи будуть додавати до старих у кінець файлу
- file - Перенаправлення дескриптора з номером n у файл file
- n>>file - Те ж саме, але з додаванням до кінця файлу
- n >)
До речі,можу помітити, що шебанг #!/bin/sh справедливий і для оболонки
Отже, ось код нашого скрипту: яким би він був, якби ми, крім копіювання, нічого від нього не вимагали б:
Всі. Більше нічого писати не треба, і ми могли б так залишити, але нам потрібно протоколювати цей процес. Для цього вносимо доповнення до скрипту, щоб знати, що скрипт справді виконався:
echo "Повідомлення">> /usr/logs/file
і після цього кожного разу, коли скрипт буде виконуватися, у нашому файлі лога (/usr/logs/file) з'являтимуться нові записи.
Отже, скрипт тепер виглядатиме ось так:
Останній рядок покаже нам те, що знаходиться в каталозі, в який ми копіювали. Для більш докладного процесу логування можна застосувати операторtest і застосувати конструкцію вибору if-fi, але потім пізніше напишу. Операторtest вміє аналізувати файли та каталоги. А на основі результату аналізу можна буде робити вибір.
Таким чином, все, що ти хочеш логувати в якомусь файлі, можеш реалізувати це за допомогою дескриптора>>.
Через місяць, коли файл стане величезним, ми його заархівуємо за допомогою іншого скрипту і почистимо для нових записів. Все це також реалізується на скриптах. Тут уже вмикайте свою фантазію, як це зробити :)
Я показав зрозумілий приклад використання логування наших скриптів. Решту ти маєш дізнатися сам, як робити, тому що простий "копі-паст" не бажаний. Тепер тільки я можу робити копі-паст з цієї статті :)