Дейв Тейлор - Сценарии командной оболочки. 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-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
····uuencode $outfname | \
····mail −s "${3:-Backup archive for $(date)}" "$2"
··echo "Done. $(basename $0) backed up the following files: "
··sed 's/^/ /' $infile
··/bin/echo −n "and mailed them to $2 "
··if [! -z "$3"]; then
····echo "with requested target directory $3"
··else
····echo ""
··fi
··exit 0
Как это работает
Убедившись с помощью простых проверок в том, что продолжение работы возможно, сценарий обрабатывает список важных файлов, передаваемый в первом аргументе командной строки, в цикле while , экранируя пробелы в именах файлов. Экранирование заключается в добавлении символа обратного слеша перед каждым пробелом. Затем командой tar
создается архив. Она не может читать список файлов со стандартного ввода, поэтому список передается в виде аргументов, с помощью команды cat.
Архиватор tar автоматически сжимает архив, а следующая за ним команда uuencode гарантирует возможность отправки полученного архива по электронной почте без повреждений. Конечный результат заключается в получении электронного письма с закодированным tar-архивом в удаленной системе.
Программа uuencode кодирует двоичные данные так, что они могут передаваться без повреждений через систему электронной почты. Дополнительную информацию смотрите в странице справочного руководства man uuencode.
Запуск сценария
Этот сценарий принимает два обязательных аргумента: имя файла со списком файлов для архивирования и резервного копирования, а также адрес электронной почты получателя сжатого и закодированного архива. Список файлов может быть таким же простым, как показано ниже:
$ cat filelist
*.sh
*.html
Результаты
В листинге 10.8 демонстрируется запуск сценария remotebackup для копирования всех HTML-файлов и файлов сценариев, имеющихся в текущем каталоге, и вывод результатов.
Листинг 10.8.Запуск сценария remotebackup для копирования HTML-файлов и файлов сценариев
$ remotebackup filelist taylor@intuitive.com
Done. remotebackup backed up the following files:
·· *.sh
·· *.html
and mailed them to taylor@intuitive.com
$ cd /web
$ remotebackup backuplist taylor@intuitive.com mirror
Done. remotebackup backed up the following files:
·· ourecopass
and mailed them to taylor@intuitive.com with requested target directory mirror
Усовершенствование сценария
Прежде всего, если у вас установлена современная версия tar, возможно, она поддерживает чтение списка файлов со стандартного ввода stdin (например, GNU-версия tar поддерживает флаг −T, при наличии которого программа читает список файлов со стандартного ввода). В этом случае сценарий можно сократить, убрав команду cat, передающую список файлов через аргументы командной строки.
Файл архива можно распаковывать или просто сохранять, запуская раз в неделю сценарий очистки почтового ящика, предотвращающий его переполнение. Простейший сценарий очистки приводится в листинге 10.9.
Листинг 10.9.Сценарий trimmailbox для использования в комплексе со сценарием remotebackup
#!/bin/bash
# trimmailbox — простой сценарий, гарантирующий сохранность только четырех
#·· последних сообщений в почтовом ящике пользователя. Предполагает
#·· использование реализации Berkeley Mail (Mailx bkb mail) — требует
#·· модификации для других почтовых систем!
keep=4 # По умолчанию сохраняет только четыре последних сообщения.
totalmsgs="$(echo 'x' | mail | sed −n '2p' | awk '{print $2}')"
if [$totalmsgs −lt $keep]; then
··exit 0····# Ничего делать не надо.
fi
topmsg="$(($totalmsgs −$keep))"
mail > /dev/null << EOF
d1-$topmsg
q
EOF
exit 0
Этот короткий сценарий удаляет из почтового ящика все письма, кроме нескольких самых последних ($keep). Очевидно, что, если в роли архивного хранилища используется почтовый ящик Hotmail или Yahoo! Mail, этот сценарий не будет работать и вам придется периодически чистить его вручную.
№ 77. Мониторинг состояния сети
Программа netstat считается одной из самых запутанных утилит администрирования Unix, что очень плохо, потому что в действительности она позволяет получить много полезной информации о пропускной способности и производительности сети. При вызове с флагом −s программа netstat выводит массу информации о каждом сетевом протоколе, поддерживаемом системой, включая TCP, UDP, IPv4/v6, ICMP, IPsec и другие. Большинство из них не поддерживаются в типичной конфигурации. Особый интерес, как правило, вызывает протокол TCP. Этот сценарий анализирует трафик, пересылаемый по протоколу TCP, определяет процент пакетов, потерянных при передаче и выводит предупреждение, если какие-то из значений выходят за рамки допустимого.
Анализ функционирования сети по значениям, накопленным за продолжительный период, определенно полезен, но намного лучше иметь возможность анализировать данные с тенденциями их изменения. Если, к примеру, система регулярно теряет 1,5 % пакетов, а в последние три дня этот показатель подскочил до 7,8 %, похоже, назревает проблема, которую требуется изучить более детально.
Вот почему сценарий состоит из двух частей. Первая часть, представленная в листинге 10.10, — это короткий сценарий, который, как предполагается, должен запускаться каждые 10–30 минут для записи ключевых статистик в файл журнала. Второй сценарий (листинг 10.11) выполняет анализ файла журнала, сообщает о нормальных параметрах функционирования сети и любых аномалиях или других значениях, постоянно увеличивающихся с течением времени.
Некоторые диалекты Unix не могут выполнять этот код в том виде, в каком он приводится здесь (но мы подтверждаем, что он работает в OS X)! Как оказывается, вывод команды netstat в разных версиях Unix и Linux имеет множество мелких различий (где-то изменены пробелы или пунктуация). Нормализация вывода netstat могла бы сама по себе стать прекрасным сценарием.
Код
Листинг 10.10.Сценарий getstats
··#!/bin/bash
··# getstats — каждые 'n' минут сохраняет значения, получаемые
··#·· с помощью netstat (из crontab).
··logfile="/Users/taylor/.netstatlog" # Измените в соответствии с вашей конфигурацией.
··temp="/tmp/getstats.$$.tmp"
··trap "$(which rm) −f $temp" 0
··if [! -e $logfile]; then·· # Первый запуск?
····touch $logfile
··fi
··(netstat −s — p tcp > $temp
··# Проверьте свой файл журнала после первого запуска: некоторые версии netstat
··#·· выводят несколько строк вместо одной, именно поэтому здесь используется
··#·· последовательность "| head -1".
··sent="$(grep 'packets sent' $temp | −d— d\ −f1 | sed \
Интервал:
Закладка: