Каждый процесс (кроме системных) является результатом запуска программы, хранящейся в файле на диске. Для запуска процесса следует ввести путь к запускаемому файлу (относительный или абсолютный) в командной строке 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).