Введение в UNIX. Лекции

Автор работы: Пользователь скрыл имя, 29 Декабря 2011 в 20:20, курс лекций

Краткое описание

Способы организации файловой системы, списки команд и т.д. ОС Unix

Вложенные файлы: 1 файл

практика.doc

— 387.00 Кб (Скачать файл)

Если файл list существует, то он будет обнулен (при этом файл не удаляется, то есть сохраняются все его атрибуты - владельцы, права, и т.д, удаляются только данные файла).

Обнуление файла  без записи в него - распространенная задача. Для этого используется команда  cat. Эта команда принимает в командной строке список файлов и отправляет их один за другим на стандартный вывод - т.е. соединяет несколько файлов в один. (Если указан один файл и вывод не перенаправлен, то cat фактически просто выводит содержимое файла на терминал.) Команда

%cat /dev/null>file

обнуляет файл file (содержимое пустого по определению файла /dev/null записывается в файл file).

Перенаправление стандартного вывода не означает перенаправления стандартной ошибки:

%ls -l b.txt qwerty  >list

Результаты поиска направляются в файл list, однако сообщения об ошибках по прежнему выводятся на терминал (предполагается, что файла qwerty в вашем каталоге нет).

Перенаправление вывода стандартной ошибки делается с помощью символов '2>' (STDERR - это  файл с дескриптором 2):

%ls -l  >list 2>errors 

%more list

%more errors

%rm list errors

Для подавления стандартного вывода или стандартной  ошибки следует перенаправить соответствующий  поток в файл /dev/null.

Иногда требуется  перенаправить потоки стандартного вывода и стандартной ошибки в один и тот же файл. Для этого можно использовать выражение 2>&1, что означает: файловый деспритор 2 (STDERR) указывает на тот же файл, что и дескриптор 1 (STDOUT).

%ls -l  2>&1 >out

%more out 

%ls -l  >out 2>&1

%more out

%rm out

В чем разница? Почему в первом случае ошибки продолжают выводиться на терминал?

Для перенаправления  вывода с добавлением в конец  файла используются символы '>>'. Если файл не существовал, он создается.

%ls -l  >>out

%more out 

%ls -l prog  >>out

%more out 

%rm out

Перенаправление ввода

Для перенаправления  стандартного ввода используется символ '<', после которого следует имя файла. Например, FTP-клиент считывает команды пользователя со стандартного ввода. Если FTP-клиент должен запускаться в отсутствие пользователя (например, в заданное время ночью), то команды пользователя можно записать в отдельный файл и перенаправить ввод программы ftp.

Пример загрузки файла ftp://uran.vvsu.ru/pub/basket/sendmail.cf.ares.

Сначала создадим файл in с командами FTP с помощью программы cat (если у cat нет аргументов, то она копирует стандартный ввод на стандартный вывод; вывод мы перенаправляем в файл - это обычный способ создания небольших файлов прямо из командной строки):

%cat >in

quote USER ftp

quote PASS buka@vvsu.ru

cd /pub/basket

get sendmail.cf.ares

bye

Ctrl-D

%more in

Теперь запустим ftp, причем стандартный направим в файл out (в него ftp выводит сообщения для пользователя, в том числе и сообщения об ошибках):

%ftp -n uran.vvsu.ru <in >out

%ls -l sendmail.cf.ares

%rm sendmail.cf.ares

Измените имя  файла sendmail.cf.ares на sendmail (такого файла на FTP-сервере нет). Снова запустите ftp как указано выше. Посмотрите, что содержится в файле out. Удалите out.

Перенаправление "ввод здесь"

Символы <<МЕТКА указывают, что стандартный ввод для программы берется из последующих командных строк до тех пор пока не встретится строка, содержащая только символы МЕТКА. Этот прием является способом поместить ввод для программы прямо в командную строку, откуда эта программа вызывается; полезен при запуске интерактивных по своей природе команд в фоновом режиме или из командного файла.

Рассмотрим еще  раз задачу загрузки файла с FTP-сервера  в отложенном режиме. (Для запуска  программы в отложенном режиме - т.е. в указанное время используется команда at.) Для этого нужно создать два файла: один - запускаемый, содержащий командную строку

%ftp -n uran.vvsu.ru <in >out

второй - файл in, содержащий команды для ftp. Это не очень удобно. Используем прием "ввод здесь" для размещения командной строки и ввода к ней в одном файле:

%cat >autoftp

ftp -n uran.vvsu.ru <<EOF >out

quote USER ftp

quote PASS buka@vvsu.ru

cd /pub/basket

get sendmail.cf.ares

bye

EOF

Ctrl-D

%more autoftp

%chmod a+x autoftp

Запустим и  проверим:

%./autoftp

%ls -l sendmail.cf.ares

%rm sendmail.cf.ares

Созданный скрипт autoftp самодостаточен, он может быть запущен и в фоновом режиме, и в режиме демона.

Программный конвейер

Символ '|' ("труба, pipe"), помещенный между двумя командами, создает программный конвейер: стандартный вывод команды, стоящей слева, передается на стандартный ввод команды, стоящей справа. Этот прием позволяет создавать цепочки команд, передающих данные друг другу.

Подсчитать число  файлов в текущем каталоге. Решение  без конвейера:

 

%ls >file.tmp

%wc -w file.tmp

%rm file.tmp

Воспользуемся тем, что при отсутствии аргумента  команда wc (как и многие другие команды берет данные) со стандартного ввода. Решение с конвейером:

%ls | wc -w

Другие примеры. Вывести длинный листинг каталога /usr/bin с постраничной разбивкой:

%ls -l /usr/bin | more

Отсортировать по алфавиту и сохранить в файл unixes все строки файла b.txt, в которых встречается слово "Unix":

%grep unix b.txt | sort > unixes

%more unixes

%rm unixes

Конвейер может  состоять более, чем из двух команд. Вывести число всех файлов текущего каталога, в имени которых встречается "txt":

%ls | grep txt | wc -w

Задание (о выполнении доложить преподавателю): а) вывести имя 11-го с конца по алфавиту файла каталога /usr/bin; б) вывести имя 3-го с конца по алфавиту файла каталога /usr/bin из файлов, начинающихся на w.

САМОПРОВЕРКА

Проверьте, усвоили  ли вы значения следующих символов:  

      >  >>  <  <<  N N>&M  |

3.2. Получение информации  о процессах

Команда ps выводит различную информацию о запущенных процессах. Запущенная без ключей, эта команда выводит сводку процессов, связанных с терминалом, с которого ее запустили. Ключи позволяют а) выбрать процессы, информацию о которых следует вывести; б) указать, какую информацию о процессах выводить.

Информация  для справки:

Основные  ключи команды ps:

-e

    вывести информацию обо всех запущенных процессах;

-u пользователь

    вывести информацию о процессах указанного пользователя;

-f

    "полный" листинг (см. таблицу ниже);

-l

    "длинный"  листинг (см. таблицу ниже);

-j

    вывести индентификаторы группы процессов  и сеанса.

Поля  вывода команды ps

Поле Описание Ключи*
S Состояние процесса:

    O - выполняется (On processor),

    R - готов к запуску (Runnable),

    S - находится в состоянии сна (Sleeping),

    Z - зомби (Zombie),

    T - остановлен (Stopped).

l
UID Идентификатор пользователя, от имени которого запущен процесс (с ключом -f выводится имя пользователя) f,l
PID Идентификатор процесса все
PPID Идентификатор родительскогопроцесса f,l
PGID Идентификатор группы процессов j
SID Идентификатор сеанса j
PRI Приоритет процесса (чем больше, тем ниже) l
NI Относительный приоритет (Nice Number) l
SZ Размер  процесса в страницах (размер страницы можно узнать командой pagesize) l
STIME Время запуска процесса f
TTY Управляющий терминал ('?' - для демонов) все
TIME Суммарное время, затраченное процессором на исполнение процесса все
CMD Имя процесса (с ключом -f выводятся первые 80 символов командной строки) все

*) - в  колонке Ключи указано, какой ключ надо дать команде ps, чтобы соответствующее поле появилось в выводе. Пометка "все" обозначает, что поле выводится всегда, в том числе и при запуске команды без ключей. Ключи -f, -l, -j можно использовать совместно для получения комбинированного вывода.

Ключи -f, -l, -j не определяют, о каких процессах выводить данные , а устанавливают только формат вывода. Для отбора процессов используйте ключи -e, -u.

Команда ps имеет также ключ -o (буква "о"), параметром которого является список полей вывода через запятую. Таким образом можно выбрать только необходимые поля, а также вывести дополнительные данные о процессе, не перечисленные в таблице выше. Наименования полей для ключа -o см. в справочнике man.  

3.3. Отправка сигналов  процессам

Команда

%kill -СИГНАЛ PID

отправляет процессу с идентификатором PID указанный сигнал. Сигнал указывается либо в символьной форме (за вычетом приставки 'SIG'), либо в виде номера сигнала. Наример, "kill -HUP PID" и "kill -1 PID" (цифра "один") - одно и то же. Список всех сигналов и их номеров можно просмотреть командой kill -l (буква "эль"). По умолчанию, если сигнал не указан, посылается сигнал SIGTERM (номер 15).

Идентификатор процесса можно узнать с помощью  команды ps (см. также выше пример быстрого поиска процесса с помощью grep). В ОС Solaris, начиная с версии 7, имеется утилита pkill, позволяющая отправить сигнал процессу, указывая не идентификатор процесса, а его имя.

Пользователь  может отправлять сигналы только к процессам, запущенным от его имени.

Пошлите сигнал SIGTERM процессу find (если он еще работает, иначе предварительно запустите его). Убедитесь, что find исчез из списка процессов.

Пошлите какой-нибудь сигнал любому процессу, которым вы не владеете.

Информация о работе Введение в UNIX. Лекции