Дейв Тейлор - Сценарии командной оболочки. 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-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Как видите, имена переменных в сценарии начинаются с сокращений, полученных из наименований значений, возвращаемых программой netstat и сохраняемых в .netstatlog в конце сценария getstats . К таким сокращениям относятся: snt, re, rec, dup, oo, creq, cacc и reto. В сценарии netperf к этим сокращениям добавляется окончание p, чтобы получить имена переменных, представляющих вещественные значения процентов от общего числа отправленных и полученных пакетов. Окончание pn добавляется к сокращениям, чтобы получить имена переменных, представляющих целочисленные версии процентов от общего числа отправленных и полученных пакетов. В сценарии netperf окончание ps обозначает переменную, представляющую усредненный процент, которая используется на финальной стадии вычислений.
Цикл while перебирает записи в файле .netstatlog , вычисляет четыре ключевых перцентиля (re, retr, dup и oo, которые представляют количество повторно отправленных пакетов, превышений таймаута при отправке, дубликатов и внеочередных (срочных) пакетов соответственно). Все это записывается во временный файл $stats , затем сценарий awk суммирует каждую колонку в $stats и вычисляет средние значения, деля суммы на количество записей в файле (NR).
Команда eval в строке связывает все вместе. Комплект статистик ($stats), полученных циклом while, передается команде awk, которая использует сценарий в файле $awktmp для вывода последовательностей variable=value. Эти последовательности variable=value затем внедряются в командную оболочку инструкцией eval, в результате чего создаются переменные reps, retops, dupps и oops, представляющие среднее количество повторно отправленных пакетов, среднее количество таймаутов при повторной передаче, среднее количество пакетов-дубликатов и среднее количество внеочередных (срочных) пакетов соответственно. Затем текущие процентные значения можно сравнивать с этими усредненными величинами, чтобы выявлять настораживающие тенденции.
Запуск сценария
Для успешной работы сценарию netperf необходима информация в файле .netstatlog . Эта информация генерируется заданием crontab, автоматически вызывающим getstats с некоторой частотой. В современной системе OS X, Unix или Linux можно добавить в crontab следующую запись, изменив путь к сценарию, чтобы он соответствовал его местонахождению в вашей системе, естественно:
*/15 * * * * /home/taylor/bin/getstats
Она создает новую запись в файле журнала каждые 15 минут. Чтобы гарантировать определенные права доступа к файлу, лучше всего создать пустой файл вручную перед первым запуском getstats:
$ sudo touch /Users/taylor/.netstatlog
$ sudo chmod a+rw /Users/taylor/.netstatlog
Теперь программа getstats будет благополучно пыхтеть над исторической картиной работы сети в вашей системе. Для анализа файла журнала запустите сценарий netperf без аргументов.
Результаты
Для начала давайте рассмотрим содержимое файла .netstatlog , показанное в листинге 10.13.
Листинг 10.13.Последние три строки в файле. netstatlog, записанные заданием crontab, вызывающим сценарий getstats через регулярные интервалы
$ tail -3 /Users/taylor/.netstatlog
time=1063981801;snt=14386;re=24;rec=15700;dup=444;oo=555;creq=563;cacc=17;reto=158
time=1063982400;snt=17236;re=24;rec=20008;dup=454;oo=848;creq=570;cacc=17;reto=158
time=1063983000;snt=20364;re=24;rec=25022;dup=589;oo=1181;creq=582;cacc=17;reto=158
Выглядит хорошо. В листинге 10.14 приводятся результаты запуска сценария netperf.
Листинг 10.14.Запуск сценария netperf для анализа файла. netstatlog
$ netperf
Netstat is currently reporting the following:
··52170128 packets sent, with 16927 retransmits (0 %) and 2722 retransmit timeouts (0 %)
··20290926 packets received, with 129910 dupes (.600 %) and 18064 out of order (0 %)
·· 39841 total connection requests, of which 123 were accepted
Analyzing trends…
(Analyzed 6 netstat log entries for calculations)
Усовершенствование сценария
Вы наверняка заметили, что вместо удобочитаемого формата представления дат сценарий getstats сохраняет даты в файле .netstatlog в виде количества секунд, истекших с начала эпохи, то есть с 1 января 1970 года. Например, 1 063 983 000 секунд означают день в конце сентября 2003 года. Использование такого формата упрощает расширение этого сценария, давая возможность вычислять время, прошедшее между записями.
№ 78. Изменение приоритета процесса по его имени
В практике администрирования часто возникают ситуации, когда полезно изменить приоритет задачи, например: отдать серверу чата только «холостые» циклы системы, понизить приоритет MP3-плеера, не являющегося важным приложением, или процесса, выполняющего загрузку файла, острая необходимость в котором отпала, или, напротив, увеличить приоритет монитора CPU. Изменить приоритет процесса можно командой renice; однако она требует передать ей числовой идентификатор процесса, что вызывает дополнительные трудности. Намного более удобный подход реализован в сценарии (листинг 10.15), который по имени процесса определяет его числовой идентификатор и автоматически изменяет приоритет указанного приложения.
Код
Листинг 10.15.Сценарий renicename
#!/bin/bash
# renicename — изменяет приоритет задания по указанному имени.
user=""; tty=""; showpid=0; niceval="+1"·· # Инициализация
while getopts "n: u: t: p" opt; do
··case $opt in
····n) niceval="$OPTARG";;;
····u) if [! -z "$tty"]; then
··········echo "$0: error: −u and −t are mutually exclusive." >&2
··········exit 1
········fi
········user=$OPTARG;;
····t) if [! -z "$user"]; then
··········echo "$0: error: −u and −t are mutually exclusive." >&2
··········exit 1
········fi
········tty=$OPTARG;;
····p) showpid=1;;;
····?) echo "Usage: $0 [-n niceval] [-u user|-t tty] [-p] pattern" >&2
········echo "Default niceval change is \"$niceval\" (plus is lower" >&2
········echo "priority, minus is higher, but only root can go below 0)" >&2
········exit 1
··esac
done
shift $(($OPTIND — 1)) # Употребить все проанализированные аргументы.
if [$# −eq 0]; then
··echo "Usage: $0 [-n niceval] [-u user|-t tty] [-p] pattern" >&2
··exit 1
fi
if [! -z "$tty"]; then
··pid=$(ps cu −t $tty | awk "/ $1/ { print \\$2 }")
elif [! -z "$user"]; then
··pid=$(ps cu −U $user | awk "/ $1/ { print \\$2 }")
else
··pid=$(ps cu −U ${USER:-LOGNAME} | awk "/ $1/ { print \$2 }")
fi
if [-z "$pid"]; then
··echo "$0: no processes match pattern $1" >&2
··exit 1
elif [! -z "$(echo $pid | grep ' ')"]; then
··echo "$0: more than one process matches pattern ${1}:"
··if [! -z "$tty"]; then
····runme="ps cu −t $tty"
··elif [! -z "$user"]; then
····runme="ps cu −U $user"
··else
····runme="ps cu −U ${USER:-LOGNAME}"
··fi
··eval $runme | \
······awk "/ $1/ { printf \" user %-8.8s pid %-6.6s job %s\n\", \
······\$1,\$2,\$11 }"
··echo "Use −u user or −t tty to narrow down your selection criteria."
Интервал:
Закладка: