Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Название:Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Автор:
- Жанр:
- Издательство:Питер
- Год:2017
- Город:СПб.
- ISBN:978-5-496-03029-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание краткое содержание
Цель этой книги — продемонстрировать практические приемы программирования сценариев на bash и познакомить с самыми распространенными утилитами на коротких и компактных примерах, не вдаваясь в излишние подробности. Экспериментируйте с этими сценариями — ломайте, исправляйте и приспосабливайте их под свои нужды, чтобы понять, как они работают. Только так вы сможете решать самые сложные задачи.
Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
····exit 1
··fi
··echo Input file $1 has $(wc −l < "$1") entries.
··start="$(grep −E '\[.*:.*:.*\]' "$1" | head -1 \
····| awk '{print $1" "$2" "$3" "$4" "$5 }')"
··end="$(grep −E '\[.*:.*:.*\]' "$1" | tail -1 \
····| awk '{print $1" "$2" "$3" "$4" "$5 }')"
··/bin/echo −n "Entries from $start to $end"
··echo ""
··### Проверить типичные и хорошо известные ошибки:
··checkfor "$1" "File does not exist"
··checkfor "$1" "Invalid error redirection directive"
··checkfor "$1" "Premature EOF"
··checkfor "$1" "Script not found or unable to stat"
··checkfor "$1" "Premature end of script headers"
··grep −vE "$screen" "$1" | grep "\[error\]" | grep "\[client " \
····| sed 's/\[error\]/\`/' | cut −d\` −f2 | cut −d\ −f4- \
····| sort | uniq −c | sort −rn | sed 's/^/ /' | head −$length > $temp
··if [$(wc −l < $temp) −gt 0]; then
····echo ""
····echo "Additional error messages in log file: "
····cat $temp
··fi
··echo ""
··echo "And non-error messages occurring in the log file: "
··grep −vE "$screen" "$1" | grep −v "\[error\]" \
····| sort | uniq −c | sort −rn \
····| sed 's/^/ /' | head −$length
··exit 0
Как это работает
Этот сценарий сканирует файл журнала error_log на наличие пяти ошибок, указанных в вызовах функции checkfor, с помощью awk извлекая из каждой записи последнее поле, то есть поле с номером в переменной $NF (которая представляет количество полей в данной записи). Затем передает результат последовательности команд sort | uniq −c | sort −rn , чтобы проще было определить источник ошибок данной категории.
Чтобы гарантировать вывод в каждой категории только соответствующих ошибок, результаты каждого поиска сохраняются во временном файле, который затем проверяется перед выводом сообщения. Все это делает функция checkfor(), находящаяся в начале сценария.
Последние несколько строк сценария находят наиболее распространенные ошибки, не относящиеся к предопределенным категориям, но являющиеся стандартными для формата журнала error_log веб-сервера Apache. Команда grep представляет собой часть длинного конвейера.
Затем сценарий находит не обнаруженные ранее наиболее распространенные ошибки, которые не являются стандартными для формата журнала error_log веб-сервера Apache. И снова команда grep составляет часть длинного конвейера.
Запуск сценария
Чтобы запустить этот сценарий, просто передайте ему в единственном аргументе полный путь к файлу журнала error_log в стандартном формате веб-сервера Apache, как показано в листинге 10.6. Если передать ему дополнительный аргумент −l length, он выведет указанное количество совпадений в каждой категории вместо пяти по умолчанию.
Результаты
Листинг 10.6.Результаты обработки журнала error_log веб-сервера Apache с помощью weberrors
$ weberrors error_log
Input file error_log has 768 entries.
Entries from [Mon Jun 05 03:35:34 2017] to [Fri Jun 09 13:22:58 2017]
File does not exist errors:
······ 94 /var/www/vhosts/default/htdocs/mnews.htm
······ 36 /var/www/vhosts/default/htdocs/robots.txt
······ 15 /var/www/vhosts/default/htdocs/index.rdf
······ 10 /var/www/vhosts/default/htdocs/clientaccesspolicy.xml
········5 /var/www/vhosts/default/htdocs/phpMyAdmin
Script not found or unable to stat errors:
········1 /var/www/vhosts/default/cgi-binphp5
········1 /var/www/vhosts/default/cgi-binphp4
········1 /var/www/vhosts/default/cgi-binphp.cgi
········1 /var/www/vhosts/default/cgi-binphp-cgi
········1 /var/www/vhosts/default/cgi-binphp
Additional error messages in log file:
········1 script '/var/www/vhosts/default/htdocs/wp-trackback.php' not found
or unable to stat
········1 script '/var/www/vhosts/default/htdocs/sprawdza.php' not found or
unable to stat
········1 script '/var/www/vhosts/default/htdocs/phpmyadmintting.php' not
found or unable to stat
And non-error messages occurring in the log file:
········6 /usr/lib64/python2.6/site-packages/mod_python/importer.py:32:
DeprecationWarning: the md5 module is deprecated; use hashlib instead
········6 import md5
········3 [Sun Jun 25 03:35:34 2017] [warn] RSA server certificate CommonName
(CN) `Parallels Panel’ does NOT match server name!?
········1 sh: /usr/local/bin/zip: No such file or directory
········1 sh: /usr/local/bin/unzip: No such file or directory
№ 76. Предотвращение катастрофических последствий с использованием удаленного архива
Независимо от наличия всеобъемлющей стратегии резервного копирования, никогда нелишне подстраховаться и организовать резервное копирование критически важных файлов в отдельный архив, хранящийся в отдельной системе, за пределами сайта. Даже если это всего один файл с адресами ваших клиентов, вашими ведомостями или даже электронными письмами от возлюбленной, внешний архив может спасти вас, когда вы меньше всего это ожидаете.
Решение задачи выглядит сложнее, чем есть на самом деле, потому что, как показано в листинге 10.7, «архив» — это всего лишь файл, посылаемый по электронной почте в удаленный почтовый ящик, который может находиться на серверах Yahoo! или Gmail. Список архивируемых файлов хранится в отдельном файле данных и допускает использование шаблонных символов, поддерживаемых командной оболочкой. Имена файлов могут содержать пробелы, что никак не усложняет сценарий, как вы увидите сами.
Код
Листинг 10.7.Сценарий remotebackup
··#!/bin/bash
··# remotebackup — принимает список файлов и каталогов, создает единый
··#·· сжатый архив и отправляет его по электронной почте на удаленный сайт
··#·· для сохранения. Может запускаться по ночам для сохранения важных
··#·· пользовательских файлов, но не может служить заменой более строгой
··#·· системы резервного копирования.
··outfile="/tmp/rb.$$.tgz"
··outfname="backup.$(date +%y%m%d). tgz"
··infile="/tmp/rb.$$.in"
··trap "$(which rm) −f $outfile $infile" 0
··if [$# −ne 2 −a $# −ne 3]; then
····echo "Usage: $(basename $0) backup-file-list remoteaddr {targetdir}" >&2
····exit 1
··fi
··if [! -s "$1"]; then
····echo "Error: backup list $1 is empty or missing" >&2
····exit 1
··fi
··# Сканировать записи и создать фиксированный список в файле infile.
··#·· В ходе этой операции выполняются экранирование пробелов и подстановка
··#·· шаблонных символов в именах файлов, то есть имя файла "this file"
··#·· превращается в this\ file, что избавляет от необходимости использовать
··#·· кавычки.
··while read entry; do
····echo "$entry" | sed −e 's/ /\\ /g' >> $infile
··done < "$1"
··# Фактическое создание архива, его кодирование и отправка.
··tar czf −$(cat $infile) | \
Интервал:
Закладка: