··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. Список архивируемых файлов хранится в отдельном файле данных и допускает использование шаблонных символов, поддерживаемых командной оболочкой. Имена файлов могут содержать пробелы, что никак не усложняет сценарий, как вы увидите сами.