Операционные системы. Учебное пособие-2
.pdfнесколько интерпретаторов, например С shell, Korn shell, T shell и др. В Linux наибольшее распространение получил интерпретатор Bourne-Again shell. Главным отличием этих командных интерпретаторов для пользователя является их синтаксис.
Shell-интерпретаторы являются также и языками программирования, которые применяется для написания командных файлов (shell - файлов). Командные файлы также называются скриптами или сценариями.
5.2. Синтаксис языка Bourne shell
Общий синтаксис скрипта
Скрипт представляет собой обычный текстовый файл, в котором записаны инструкции, понятные командному интерпретатору. Это могут быть команды, выражения shell или функции. Командный интерпретатор считывает эти инструкции из файла и последовательно выполняет их.
Поскольку в системе могут существовать скрипты для различных интерпретаторов, имя интерпретирующей команды обычно помещается в первой строке следующим образом:
#! /bin/sh
В данном случае последующий текст скрипта будет интерпретироваться Bourne shell. При запуске файла-скрипта из командной строки, он должен обладать правом на выполнение — х, при этом будет запущен новый командный интерпретатор, ввод команд для которого будет выполняться из файла скрипта.
Простые переменные
В командной строке или скрипте командного интерпретатора можно определить и использовать переменные. Значением переменной является строка, которая передается присвоением:
var = value,
где var — имя переменной, a value — ее значение.
Значение переменной можно получить, используя знак $. Например, вывести значение переменной name на экран можно с помощью команды echo следующим образом:
$ echo $name
21
Так же можно присвоить переменной значение другой переменной:
$ z=1000 $ х= $z $ есhо $х
1000
Значение переменной можно присвоить иначе. Поскольку значение представляет собой строку, shell предоставляет удобный способ генерации строк из потока вывода команды. Синтаксис присвоения при этом следующий:
$ var = `command`,
где var — имя переменной, a command — название команды. Например:
$ dir = `pwd` $ echo $cdir /usr/home/user
Позиционные переменные
Помимо переменных, определяемых явно, shell имеет ряд внутренних переменных, значения которых устанавливаются самим интерпретатором.
Эти переменные приведены в табл. 5.1.
|
Таблица 5.1. |
|
|
|
|
$1, $2,... |
Позиционные параметры скрипта |
|
$# |
Число позиционных параметров скрипта |
|
$? |
Код возврата последнего выполненного процесса |
|
$$ |
Идентификатор процесса (PID) текущего shell |
|
$! |
PID последнего процесса, запущенного в фоновом |
|
|
режиме |
|
$* |
Все параметры, переданные скрипту. Передаются |
|
|
как единое слово, заключенное в кавычки: ―$*‖ = |
|
|
―$1, $2, . . .‖ |
|
$@ |
Все параметры, переданные скрипту. Передаются |
|
|
как отдельные слова, заключенные в кавычки: ―$*‖ = |
|
|
―$1, $2, . . .‖ |
|
Эти переменные редко используются при работе в командной строке, основная область их применения — скрипты. Например:
Текст скрипта test1.sh |
Запуск скрипта |
|
22 |
# !/bin/sh |
|
$ ./test1.sh a1 a2 a3 |
echo script $0 |
script ./test1.sh |
|
echo $1 $2 |
$3 |
a1 a2 a3 |
Значение $# равно числу позиционных параметров. Его удобно использовать при проверке соответствия числа введенных пользователем параметров требуемому.
Текст скрипта test2.sh |
Запуск скрипта |
# !/bin/sh |
$ ./test2.sh |
if [ $# -lt 2 ] |
usage: ./test1.sh arg1 arg2 |
echo usage: $0 arg1 arg2 |
|
exit 1 |
|
fi |
|
В данном примере использовано условное выражение if и проверка, которые, будут рассмотрены ниже.
Текст скрипта test3.sh
grep user /etc/passwd #поиск слова user в файле паролей if [ $? -ne 0 ]
then
echo пользователь user в системе не зарегистрирован fi
Перенаправление ввода/вывода
Каждая запущенная из командного интерпретатора программа получает три открытых потока ввода/вывода:
1.стандартный ввод;
2.стандартный вывод;
3.стандартный вывод ошибок.
По умолчанию ввод осуществляется с клавиатуры терминала, а вывод программы, включая сообщения об ошибках, будет происходить на экран терминала. Shell позволяет перенаправлять потоки ввода/вывода. Например, можно подавить вывод сообщений об ошибках, установить ввод или вывод из файла и передать вывод одной программы на ввод другой. В табл. 5.2 приведен синтаксис основных операторов перенаправления ввода/вывода.
Таблица 5.2.
>file Перенаправление стандартного потока вывода в файл file.
>>file Добавление в конец файла file данных из стандартного
23
потока вывода.
<file Получение стандартного потока ввода из файла file.
p1|р2 Передача стандартного потока вывода программы р1 в поток ввода р2 (конвейер). Используется для построения цепочек команд.
Пример:
$ cat file1 > file2 – Вывод содержимого файла file 1 в file 2;
$ cat file1 > file2 – Добавление в конец файла file2 содержимого файла file 1;
$ cat /etc/passwd | grep user – поиск пользователя user в файле паролей;
$ grep user /etc/passwd > file1 – добавление данных о пользователе user в файл file1.
Арифметические операции
Команда expr (express -- выражать) вычисляет выражение и записывает результат в стандартный вывод. Элементы выражения разделяются пробелами; символы, имеющие специальный смысл в командном языке, нужно экранировать. Строки, содержащие специальные символы, заключают в апострофы. Используя команду expr, можно выполнять сложение, вычитание, умножение, деление, взятие остатка, сопоставление символов.
Примеры:
b=190
a=` expr 200 - $b` #вычитание
d=` expr $a + 125 "*" 10` # умножение, сложение c=` expr $d % 13` # взятие остатка от деления
Здесь знак умножения заключается в двойные кавычки, чтобы интерпретатор не воспринимал его как метасимвол.
Ниже приведен пример сопоставления символов (:) с указанием числа совпадающих символов:
concur=` expr "abcdefgh" : "abcde"` echo $concur
ответ 5.
24
Встроенные команды
Встроенные команды являются частью интерпретатора и не требуют для своего выполнения проведения последовательного поиска файла команды и создания новых процессов. Приведем пример некоторых встроенных команд:
cd [dir] - назначение текущего каталога;
exec [cmd [arg...]] <имя файла> - выполнение команды, заданной аргументами cmd и arg, путем вызова соответствующего выполняемого файла.
eval [ -arg] - вычисление и выполнение команды;
sh <filename.sh> выполнение командного файла filename.sh;
exit [n] - приводит к прекращению выполнения программы, возвращает код возврата, равный нулю, в вызывающую программу;
export [name [=word]...] - включение в среду. Команда export объявляет, что переменные name будут включаться в среду всех вызываемых впоследствии команд;
read name - команда вводит строку со стандартного ввода и присваивает прочитанные слова переменным, заданным аргументами name.
Условные выражения
Условный оператор if имеет следующий формат:
if условие then
command1
command2
else
command3
command4
…
fi
Команда test (проверить) используется с условным оператором if и операторами циклов. Действия при этом зависят от кода возврата test. Test проводит анализ файлов, числовых значений, цепочек символов. Нулевой код выдается, если при проверке результат положителен, ненулевой код при отрицательном результате проверки.
25
В случае анализа файлов синтаксис команды следующий:
test [ -rwfds] file
где
-r – файл существует и его можно прочитать (код завершения 0); -w – файл существует и в него можно записывать;
-f – файл существует и не является каталогом; -d – файл существует и является каталогом; -s – размер файла отличен от нуля.
Например, приведем фрагмент скрипта, проверяющего наличие новой почты в почтовом ящике пользователя
if [ test -s $MAIL ] then
echo "Пришла почта" fi
При анализе числовых значений команда test проверяет, истинно ли данное отношение, например, равны ли А и В. Сравнение выполняется в формате:
-eq |
|
А = В |
-ne |
|
А <> B |
test A -ge B |
эквивалентно |
А >= В |
-le |
|
А <= В |
-gt |
|
А > В |
-lt |
|
А < В |
Отношения слева используются для числовых данных, справа – для символов.
Более сложные выражения могут быть образованы с помощью логических операторов:
! выражение |
Оператор НЕ |
выражение –а выражение |
Оператор И |
выражение –o выражение |
Оператор ИЛИ |
Пример:
26
Фрагмент скрипта, анализирующий ввод имени пользователя, сохраненный в переменной ANSW. Если пользователь ввел ″N″ или ″n″, то скрипт завершает свою работу.
if [ ″ANSW″ = ″N″ -о ″ANSW″ = ″n″ ] then
exit
fi
Циклы
Язык программирования Bourne shell имеет несколько операторов цикла.
while условие do
command1
command2
done
С помощью оператора while команды command1, command2 и т. д. будут выполняться, пока условие не станет ложным. Как и в случае с оператором if, условие генерируется кодом возврата команды test.
until условие do
command1
command2
…
done
В случае оператора until команды команды command1, command2 и т. д. будут выполняться, пока условие не станет истинным.
Программный цикл может быть размещен внутри другого цикла (вложенный цикл). Оператор break прерывает ближайший к нему цикл. Если в программу ввести оператор break с уровнем 2 (break 2), то это обеспечит выход за пределы двух циклов и завершение программы. Оператор continue передает управление ближайшему в цикле оператору while.
Оператор цикла с перечислением for:
for var in список do
command1
command2
27
…
done
Оператор for обеспечивает выполнение цикла столько раз, сколько слов в списке. При этом переменная var последовательно принимает значения, равные словам из списка. Список может формироваться различными способами, например как вывод некоторой команды или с помощью шаблонов shell.
Пример:
Скрипт очистки во временных каталогах не используемых файлов, доступ к которым осуществлялся более недели назад.
for dir in /tmp /usr/tmp /home/tmp do
find $dir ! -type d –atime +7 –exec rm{}
done
Ветвление
Команда case обеспечивает ветвление по многим направлениям в зависимости от значений аргументов команды. Формат:
case слово in шаблон1)
command ;;
шаблон2) command ;;
…
*)
command ;;
esac
Значение слово сравнивается с шаблонами, начиная с первого. Если совпадение найдено, то выполняются команды соответствующего раздела, который заканчивается двумя символами ';'. Если совпадения с другими шаблонами не произошло, то будут выполняться команды раздела '*)'.
Пример:
echo -n 'Please, write down your age' read age
case $age in
test $age -le 20) echo 'you are so young' ;; test $age -le 40) echo 'you are still young' ;;
28
test $age -le 70) echo 'you are too young' ;; *) echo 'Please, write down once more'
esac
5.3. Задание на лабораторную работу
Составьте и выполните shell - программы, включающей следующие действия:
1.Вывод на экран списка параметров командной строки с указанием номера каждого параметра.
2.Присвоение переменным А, В и С значений 10, 100 и 200, вычисление и вывод результатов по формуле D=(A*2 + B/3)*C.
3.Формирование файла со списком файлов в домашнем каталоге, вывод на экран этого списка в алфавитном порядке и общего количества файлов.
4.Запрос и ввод имени пользователя, сравнение с текущим именем пользователя и вывод сообщения: верно/неверно.
5.Запрос и ввод имени файла в текущем каталоге и вывод сообщения о типе файла.
6.Циклическое чтение системного времени и очистка экрана в заданный момент.
7.Циклический просмотр списка файлов и выдача сообщения при появлении заданного имени в списке.
8.Вывести списки всех файлов в заданном каталоге, которые были созданы в один день.
9.Для файла с заданным именем определить, является ли он символической ссылкой. Если да, то нужно проследить всю цепочку ссылок от этого имени.
10.Подсчитать количество строк, содержащих заданное слово в заданном файле. Если файл имеет тип, отличный от "ISO-8859 text", подсчет не производить, а просто вывести сообщение об этом.
Примечание: для проверки типа файла используйте команду file, для подсчета числа слов – wc.
11.В заданном файле определить повторяющиеся строки, вывести их номера.
12.В заданном каталоге определить, какие имена файлов являются жесткими ссылками на один и тот же файл.
Примечание: команда ls с опцией -l выдает числа файловых индексов. Файлы, у которых эти числа совпадают, и являются жесткими ссылками на один и тот же файл.
13.Вывести имена всех файлов и подкаталогов в заданном каталоге, принадлежащих пользователю с заданным именем и общее число всех остальных файлов и каталогов.
29
14.Вывести список всех каталогов, перечисленных в переменной окружения PATH, и для каждого вывести права доступа к нему
Примечание: содержимое PATH может быть получено при помощи команды env, а информацию о правах дает команда ls с опцией -l.
5.4. Контрольные вопросы
1.Какое назначение имеют shell - файлы?
2.Как создать shell - файл и сделать его выполняемым?
3.Какие типы переменных используются в shell - файлах?
4.В чем заключается анализ цепочки символов?
5.Какие встроенные команды используются в shell - файлах?
6.Как производится управление программами?
7.Назовите операторы создания циклов.
8.Для чего и как используются операторы перенаправления потоков?
6. Мониторинг производительности, управление процессами и автоматизация заданий
6.1. Мониторинг производительности
Одним из фундаментальных отличий серверных операционных систем от настольных является возможность управлять процессами. FreeBSD позволяет контролировать любой процесс в системе, начиная с простых пользовательских процессов и кончая жизненно важными системными процессами. Можно получить список текущих процессов, количество потребляемых ресурсов каждым процессом, перезапустить процесс, изменить ему приоритет и передать сигнал прерывания.
Простейшей утилитой мониторинга процессов является top. Утилита выводит на экран ежесекундно обновляющуюся информацию о текущем состоянии системы. Другой утилитой мониторинга является утилита ps. В отличие от top она не является интерактивной, но выводит некоторые дополнительные подробности.
ps [al] [number], где
-a – вывод информации обо всех активных процессах, запущенных с вашего терминала;
-l – полная информация о процессах;
number – номер процесса.
30
