Выбрать главу

Результаты

Для начала давайте рассмотрим содержимое файла .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."

elif [$showpid −eq 1]; then

··echo $pid

else

··# Все готово. Изменить приоритет!

··/bin/echo −n "Renicing job \""

··/bin/echo −n $(ps cp $pid | sed 's/ []*/ /g' | tail -1 | cut −d\ −f6-)

··echo "\" ($pid)"

··renice $niceval $pid