Главная » Программирование для UNIX » Процессы UNIX

0

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

$ date;  who

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

ber

tty7

Sep 26 23:34

$

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

Несколько программ могут  выполняться и  одновременно. Предположим, надо сделать что-то, отнимающее много  времени, например подсчитать количество слов  в книге, при  этом вам  не хотелось бы ждать окончания выполнения команды wc для  того,  чтобы запустить какуюто другую программу. Чтобы добиться этого,  введите

$ wc ch* >wc.out  &

$

Знак амперсанда &  в конце командной строки сообщает оболочке, что следует «начать выполнение этой  программы, а затем принимать новые  команды с терминала незамедлительно», то есть  не ждать завершения работы программы. Таким образом, команда начинает выполняться, и пока  она выполняется, можно делать что-то  еще.  Если на-

1        Скорее  всего, будет напечатано что-то вроде [1]  6944. – Примеч. науч. ред.

править вывод  в файл wc.out, то он не будет мешать вашей работе  во время выполнения этой команды.

Экземпляр выполняющейся программы  называется процессом. Чис ло, выводимое оболочкой для команды, запущенной со знаком &, называется идентификатором процесса; с его помощью можно в других командах ссылаться на конкретную выполняющуюся программу.

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

Если конвейер инициируется с применением &, например

$ pr  ch* | lpr  &

6951                        Идентификатор процесса lpr

$

то все входящие в него  процессы запускаются одновременно – знак & относится ко  всему  конвейеру. Но  идентификатор выводится  только один – для последнего процесса из последовательности.

Команда

$ wait

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

Используя идентификатор, выведенный оболочкой, можно остановить процесс, инициированный со знаком &:

$ kill 6944

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

$ ps  -ag

PID TTY  TIME  CMD

36  co    6:29  /etc/cron 6423  5      0:02  –sh

6704 1     0:04  –sh

6722 1     0:12  vi  paper

1        Скорее, ps  –ax для BSD и ps  –ef для System V. – Примеч. науч. ред.

4430 2     0:03  –sh

6612  7      0:03  –sh 6628  7      1:13  rogue

6843 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 –  это  идентификатор процесса (process-id);  TTY  –  терминал, свя занный с процессом (как в who); TIME  – время использования процессора в минутах и секундах; а в конце каждой строки выведена выполняющаяся команда. Команда ps в разных версиях системы выполняется по-разному, поэтому на некоторых компьютерах вывод может быть отформатирован иначе. Даже аргументы могут  быть другими – см. страницу ps(1)  в руководстве (man).

Процессы имеют  такой же  тип  иерархической структуры, как и фай лы:  у каждого процесса  есть  порождающий (родительский) процесс, каждый процесс может порождать процессы. Ваш  экземпляр оболоч ки  был  создан  процессом, связанным с терминалом, с  которого  был осуществлен вход  в систему. Когда вы  запускаете команды, эти  процессы становятся прямыми потомками оболочки. Если запустить программу из одного из них, используя, например, ! для  выхода в оболоч ку из ed, порождается новый процесс, который, следовательно, является внуком оболочки.

Иногда процессу требуется так  много времени на выполнение, что возникает желание запустить его, потом  выключить терминал и уйти, не дожидаясь завершения.  Однако если  выключить терминал или  прервать соединение, то процесс, как правило, будет убит, даже если ука зать  знак &. Специально для таких ситуаций создали команду nohup (no hangup – не реагировать на разрыв линии). Если ввести

$ nohup          команда &

то выполнение команды будет продолжено даже после  выхода из системы. Весь вывод  команды сохраняется в файле nohup.out. Способа осуществить nohup команды задним числом не существует.

Если процесс занимает значительную часть ресурсов процессора, то по отношению к людям, использующим систему совместно с вами, будет вежливо запустить такой процесс с низким приоритетом; это делается при помощи программы nice:

$ nice            команда5требующая5огромных5ресурсов  &

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

И последний вариант – можно сказать системе, чтобы  она  запустила процесс, например рано утром, когда нормальные люди  еще спят, а не сидят за компьютером. Для  этого существует команда at(1):

$ at        время любые команды … ctld

$

Команды могут  вводиться не только с терминала, но и из файла:

$ at  3am  <file

$

Время может быть  указано как в 24-часовом формате, например 2130, так и в 12-часовом, например 930pm.

Источник: Керниган Б., Пайк Р., UNIX. Программное окружение. – Пер. с англ. – СПб: Символ-Плюс, 2003. – 416 с., ил.

По теме:

  • Комментарии