Для успешной работы сценарию 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"
Читать дальше