Чтение онлайн

ЖАНРЫ

UNIX — универсальная среда программирования
Шрифт:

Tue Sep 27 01:03:17 EDT 1983

ken tty0 Sep 27 00:43

dmr tty1 Sep 26 23:45

rob tty2 Sep 26 23:59

bwk tty3 Sep 27 00:06

jj tty4 Sep 26 23:31

you tty5 Sep 26 23:04

her tty7 Sep 26 23:34

Обе команды будут выполнены (подряд) прежде, чем интерпретатор вновь вернется с приглашением.

Можно также при желании запустить несколько команд одновременно. Предположим, что вы собираетесь заняться длительными вычислениями, например, подсчитать число слов в вашей книге, но

не хотите ждать окончания команды
wc
для перехода к другой работе. Тогда можно задать:

$ wc ch* > wc.out &

6944
Shell дает номер процесса

$

Амперсанд (

&
) в конце командной строки указывает интерпретатору, что нужно запустить данную команду, а затем сразу перейти к получению последующих команд с терминала, т.е. не ждать ее завершения. Итак, команда будет выполняться, а вы можете отвлечься на что-нибудь другое. Переключение выходного потока на файл
wc.out
предотвращает возможность его смешивания с той информацией, которая появится на терминале в процессе дальнейшей работы.

Каждый экземпляр запущенной программы называется процессом. Число, выдаваемое

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

Важно понимать различие между программами и процессами. Скажем,

wc
— это программа, но каждый запуск программы
wc
создает новый процесс. Если одновременно выполняется несколько экземпляров одной программы, то любой из них считается отдельным процессом с отличным от других номером.

Если конвейер завершается операцией

&

$ pr ch * | lpr &

6951
Номер процесса

$

то все процессы этого конвейера начинают выполняться сразу, и

&
относится ко всем программам, участвующим в конвейере. Однако выдается только номер процесса, относящийся к последней программе в конвейере. Команда

$ wait

ожидает, пока не завершатся все процессы, запущенные с помощью

&
. Если она не возвращается сразу, значит, у вас есть незавершенные команды. Прервать выполнение команд можно, нажав клавишу DELETE.

Можно использовать номер процесса, сообщаемый интерпретатором, для остановки процесса, инициированного операцией

&
:

$ kill 6944

Если вы забыли номер процесса, команда

ps
выведет сообщение обо всех ваших процессах. В том случае, когда вам некогда, команда
kill 0
уничтожит все ваши процессы, за исключением начального процесса-интерпретатора. Если же вам интересно, что делают другие пользователи, команда
ps -ag
сообщит обо всех выполняемых процессах. Приведем пример вывода:

$ ps -ag

 PID TTY TIME CMD

36 со 6:29 /etc/cron

6423 5 0:02 -sh

6704 1 0:04 -sh

6722 1 0:12 vi paper

4430 2 0:03 -sh

6612 7 0:03 -sh

6628 7 1:13 rogue

6643 2 0:02 write dmr 6949 4 0:01 login bimmler

6952 5 0:08 pr ch1.1 ch1.2 ch1.3 ch1.4

6951 5 0:03 lpr

6959 5 0:02 ps -ag

6844 1 0:02 write rob

$

Здесь

PID
номер процесса;
TTY
— терминал, связанный с процессом (как в команде
who
);
TIME
— затраченное время процессора в минутах и секундах, а в конце строки — выполняемая команда. Команда
ps
— одна из тех команд, которые выполняются по- разному в различных версиях системы, так что вывод в вашей системе может иметь другой формат. Даже аргументы могут отличаться — см. в своем справочном руководстве страницу
ps(1)
.

Процессы, подобно файлам, имеют иерархическую структуру: у каждого процесса есть родитель и могут быть потомки. Ваша копия интерпретатора

shell
была создана процессом, обслуживающим связь через терминал с системой. Когда вы запускаете команды, их процессы становятся прямыми потомками вашей копии
shell
. Если вы запускаете программу "внутри" одной из этих команд, например команду
'!'
для выхода из редактора
ed
, то создается новый процесс-потомок, который является, таким образом, уже внуком для
shell
.

Иногда процесс выполняется столь долго, что вы уже жалеете, что запустили его. Выключите терминал и идите домой, не дожидаясь его окончания. Но если вы выключите терминал или отсоедините его от сети, то процесс будет уничтожен, даже если применен

&
. Специально для такого случая предусмотрена команда
nohup
("no hangup" — без отбоя).

Введите

$ nohup команда &

и команда будет продолжать выполняться, даже если выйти из системы. Любой результат выполнения команды будет сохранен в файле, называемом

nohup.out
. После запуска программы никакая команда
nohup
уже не поможет.

Если ваш процесс требует много процессорного времени, вы можете облегчить участь тех, кто работает вместе с вами, запустив его с приоритетом ниже обычного. Это можно сделать с помощью программы

nice
:

$ nice большая-команда &

Команда

nohup
автоматически вызывает
nice
, поскольку раз уж вы собираетесь выйти из системы, то можете позволить, чтобы ваша команда выполнялась дольше.

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

at(1)
:

$ at

время любые команды

какие угодно...

ctl-d

$

Это пример типичного использования команды

at
, но, конечно, команды можно брать и из файла:

$ at 3am < файл

$

Время можно задавать исходя из 24-часового цикла как

2130
или 12-часового как
930pm
.

Создание среды

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

#
и
@
. Вы можете изменить их в любой момент с помощью команды

Поделиться с друзьями: