Автор работы: Пользователь скрыл имя, 29 Декабря 2011 в 20:20, курс лекций
Способы организации файловой системы, списки команд и т.д. ОС Unix
Если файл 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
Для подавления
стандартного вывода или стандартной
ошибки следует перенаправить
Иногда требуется перенаправить потоки стандартного вывода и стандартной ошибки в один и тот же файл. Для этого можно использовать выражение 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/
Сначала создадим файл 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
Другие примеры.
Вывести длинный листинг
%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
|
*) - в колонке Ключи указано, какой ключ надо дать команде 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 исчез из списка процессов.
Пошлите какой-нибудь сигнал любому процессу, которым вы не владеете.