Запуск процессов и управление вводом-выводом




Каждый процесс (кроме системных) является результатом запуска программы, хранящейся в файле на диске. Для запуска процесса следует ввести путь к запускаемому файлу (относительный или абсолютный) в командной строке shell. Если путь не указан, shell будет искать программу, последовательно проверяя каталоги, указанные в переменной окружения PATH. Найдя файл (файл должен иметь права на запуск), shell проверяет его формат. Если файл является двоичным исполнимым файлом, то он запускается. Если файл - текстовый, то анализируется его первая строка, которая должна содержать путь к интерпретатору программы в виде:

#!/usr/bin/sh

или

#!/usr/local/bin/perl –w

В этом случае shell запускает указанный интерпретатор и передает ему имя текстового файла для исполнения. Если строка с указанием интерпретатора не найдена, то shell запускает свою копию, которая пытается исполнить файл как последовательность команд командной строки.

 

Запуск в фоновом режиме

Если сама программа не предусматривает иное, процесс запускается в интерактивном режиме, т.е. shell ожидает завершения процесса, прежде чем вернуть приглашение командной строки. Для запуска процесса в фоновом режиме, командную строку следует завершить символом '&' (амперсанд).

Обратите, внимание, что shell выдал номер процесса ls и сразу же вернул приглашение командной строки. Тем не менее, команда ls, хотя и запущенная в фоновом режиме, вывела данные как обычно на терминал, поскольку стандартный вывод этой команды по-прежнему связан с терминалом. То же касается и вывода в стандартную ошибку.

Сложнее обстоит дело, если процесс, запущенный в фоновом режиме пытается считать данные со стандартного ввода. В этом случае, если shell поддерживает управление заданиями, то процесс будет остановлен по сигналу SIGTTIN и будет возобновлен после того, как пользователь переведет его в интерактивный режим.

Запуск в режиме демона

Для запуска процесса в режиме демона, следует в начале командной строки ввести префикс nohup, а в конце - амперсанд. При этом, если пользователем не указано иное, стандартный вывод направляется в файл nohup.out в текущем каталоге или в домашнем, если у пользователя нет прав записи в текущий каталог.

Отличие фонового режима от демона заключается в том, что в режиме демона процесс не связан с терминалом, следовательно, завершение сеанса работы пользователя не приведет к завершению процесса.

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

В системе по-умолчанию всегда открыты три "файла" – stdin (клавиатура), stdout (экран) и stderr (вывод сообщений об ошибках на экран). Эти, и любые другие открытые файлы, могут быть перенапрвлены. В данном случае, термин "перенаправление" означает получить вывод из файла, команды, программы, сценария или даже отдельного блока в сценарии и передать его на вход в другой файл, команду, программу или сценарий.

С каждым открытым файлом связан дескриптор файла. Дескрипторы файлов stdin, stdout и stderr -- 0, 1 и 2, соответственно. При открытии дополнительных файлов, дескрипторы с 3 по 9 остаются незанятыми. Иногда дополнительные дескрипторы могут сослужить неплохую службу, временно сохраняя в себе ссылку на stdin, stdout или stderr. Это упрощает возврат дескрипторов в нормальное состояние после сложных манипуляций с перенаправлением и перестановками.

Команда перенаправления вывода Описание
COMMAND_OUTPUT > Перенаправление stdout (вывода) в файл. Если файл отсутствовал, то он создется, иначе -- перезаписывается.
ls -lR > dir-tree.list Создает файл, содержащий список дерева каталогов
: > filename Операция > усекает файл "filename" до нулевой длины. Если до выполнения операции файла не существовало, то создается новый файл с нулевой длиной. Символ: выступает здесь в роли место заполнителя, не выводя ничего.
> filename тот же результат, что и выше -- ": >", но этот вариант неработоспособен в некоторых командных оболочках.
COMMAND_OUTPUT >> Перенаправление stdout (вывода) в файл. Создает новый файл, если он отсутствовал, иначе -- дописывает в конец файла.
1>filename Перенаправление вывода (stdout) в файл "filename".
1>>filename Перенаправление вывода (stdout) в файл "filename", файл открывается в режиме добавления.
2>filename Перенаправление stderr в файл "filename".
2>>filename Перенаправление stderr в файл "filename", файл открывается в режиме добавления.
&>filename Перенаправление stdout и stderr в файл "filename".
2>&1 Перенаправляется stderr на stdout. Сообщения об ошибках передаются туда же, куда и стандартный вывод.

Допускается перенаправление нескольких потоков в один файл.

ls -yz >> command.log 2>&1

 

Сообщение о неверной опции "yz" в команде "ls" будет записано в файл "command.log", поскольку stderr перенаправлен в файл.

 

Команда

 

cat /dev/null>file

 

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

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-11-19 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: