Изучаем Linux, 101: Cоздание, отслеживание и уничтожение процессов

Источник: IBM

Краткий обзор

Из этой статьи вы узнаете об основных приемах управления процессами в Linux. Вы научитесь:

  • Управлять приоритетными и фоновыми заданиями.
  • Запускать процессы, которые будут продолжать работать после вашего выхода из системы.
  • Следить за состоянием процессов.
  • Выбирать и сортировать процессы для вывода на экран.
  • Посылать сигналы процессам.

Эта статья поможет вам подготовиться к сдаче экзамена LPI 101 на администратора начального уровня (LPIC-1) и содержит материалы цели 103.5 темы 103. Цель имеет вес 4.

Чтобы извлечь наибольшую пользу из наших статей, необходимо обладать базовыми знаниями о Linux и иметь работоспособный компьютер с Linux, на котором можно будет выполнять все встречающиеся команды. Иногда различные версии программ выводят результаты по-разному, поэтому содержимое листингов и рисунков может отличаться от того, что вы увидите на вашем компьютере. Все примеры этой статьи были выполнены в операционной системе Ubuntu 9.10 (Karmic Koala).

Управление приоритетными и фоновыми заданиями

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

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

Если вы используете графическую оболочку X Window, то, вероятно, на вашем компьютере установлены такие утилиты, как xclock или xeyes. Если же они не установлены, то, скорей всего, их можно найти в пакете xorg-x11-apps или x11-apps. Для наших примеров подойдут обе эти утилиты, но мы будем использовать xclock. Прочитав man-страницу, вы узнаете, что цифровые часы на вашем рабочем столе можно запустить с помощью следующей команды:

xclock -d -update 1

Опция -update 1 задает обновление часов каждую секунду; в противном случае часы обновляются каждую минуту. Итак, запустим эту команду в окне терминала. Вы должны увидеть часы, изображенные на рисунке 1, а содержимое вашего окна терминала должно быть похожим на содержимое листинга 1. Если вы не увидели на рабочем столе часы xclock, то это не беда. Далее я покажу, как создать обычные цифровые часы в окне терминала, а пока вы можете продолжать изучение статьи и вернуться к этим упражнениям позже.

Примечание. На момент написания этой статьи в работе xclock присутствовала программная ошибка, которая проявлялась при включенных эффектах рабочего стола. Она проявлялась, прежде всего, в том, что панель заголовков не менялась даже при переключении на нее. Если при выполнении этого примера с xclock у вас возникнет такая ошибка, то можно временно отключив эффекты рабочего стола.

Рисунок 1. Цифровые часы xclock
Рисунок 1. Цифровые часы xclock

Листинг 1. Запуск xclock

ian@attic4:~$ xclock -d -update 1
           

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

Листинг 2. Приостановка xclock с помощью Ctrl-z

ian@attic4:~$ xclock -d -update 1  
^Z
[1]+  Stopped                 xclock -d -update 1
           

Часы все еще находятся на вашем рабочем столе, но из-за приостановки они не идут, и даже если закрыть часть часов, перетащив на них другое окно, то она даже не будет перерисована. Обратите внимание на сообщение "[1]+ Stopped" в окне терминала. Цифра 1 в этом сообщении означает номер задания . Вы можете перезапустить часы, набрав команду fg %1. Здесь вы также можете использовать имя команды или его часть, набрав, например, fg %xclock или fg %?clo. Наконец, если вы запустите команду fg без каких-либо параметров, то будет перезапущено самое последнее остановленное задание, в нашем случае это задание 1. Перезапуск задания с помощью fg возобновляет его работу в приоритетном режиме, и вы вновь не увидите приглашения. В этой ситуации нам нужно перевести задание в фоновый режим ; именно для этого предназначена команда bg, параметры которой аналогичны параметрам команды fg.

В листинге 3 показано, как возобновить работу программы xclock в приоритетном режиме, приостановить ее, и снова запустить, используя две формы команды fg. После приостановки вы можете возобновить работу xclock в фоновом режим - часы будут продолжать работать, а вы сможете продолжить работу в окне терминала.

Листинг 3. Перевод xclock в приоритетный или фоновый режим работы

        
ian@attic4:~$ fg %1
xclock -d -update 1
^Z
[1]+  Stopped                 xclock -d -update 1
ian@attic4:~$ fg %?clo
xclock -d -update 1
^Z
[1]+  Stopped                 xclock -d -update 1
ian@attic4:~$ bg
[1]+ xclock -d -update 1 &

Использование "&"

Вы могли заметить, что при переводе xclock в фоновый режим в конце команды используется амперсанд (&), а сообщение "Stopped" исчезает. На самом деле, совсем не обязательно приостанавливать процесс для его перевода в фоновый режим; для этого нужно просто добавить амперсанд в конец команды, и интерпретатор запустит ее (либо список команд) в фоновом режиме. Давайте используем этот прием для запуска аналоговых часов. Вы должны увидеть часы, показанные на рисунке 2, а содержимое вашего окна терминала должно быть похожим на содержимое листинга 4.

Рисунок 2. Аналоговые часы xclock
Рисунок 2. Аналоговые часы xclock

Листинг 4. Запуск аналоговых часов xclock в фоновом режиме с помощью &

        
ian@attic4:~$ xclock -bg wheat -update 1&
[2] 4320

На этот раз сообщение немного отличается. Оно содержит номер задания и идентификатор процесса process id (PID). Вскоре мы более подробно рассмотрим идентификаторы и статусы процессов, а пока давайте запустим команду jobs и выясним, какие задания выполняются в нашей системе. Добавьте опцию -l для отображения идентификаторов PID, и вы увидите, что задание 2 имеет идентификатор PID 4320, как показано в листинге 5. Также обратите внимание на то, что задание 2 содержит знак +, который означает, что это задание является текущим . Если никакое другое задание не назначено на выполнение командой fg, то текущее задание будет выполняться в приоритетном режиме.

Листинг 5. Вывод информации о запущенных заданиях и выполняющихся процессах

ian@attic4:~$ jobs -l
[1]-  3878 Running                 xclock -d -update 1 &
[2]+  4320 Running                 xclock -bg wheat -update 1 &

Прежде, чем перейти к рассмотрению других вопросов, связанных с фоновыми заданиями, давайте создадим в окне терминала простые цифровые часы. Мы будем использовать команду sleep для создания двухсекундной паузы и команду date для отображения текущих даты и времени. Мы поместим эти две команды в цикл while с блоком do/done для создания бесконечного цикла. Наконец, мы заключим всю конструкцию в скобки для создания списка команд и запустим этот список на выполнение в фоновом режиме, используя амперсанд. О том, как создавать более сложные команды с помощью циклов и сценариев, вы узнаете из следующих статей этой серии.

Листинг 6. Простые цифровые часы

ian@attic4:~$ (while sleep 2; do date;done)&
[2] 4856
ian@attic4:~$ Tue Jan 19 09:23:30 EST 2010
Tue Jan 19 09:23:32 EST 2010
Tue Jan 19 09:23:34 EST 2010
fTue Jan 19 09:23:36 EST 2010
Tue Jan 19 09:23:38 EST 2010
gTue Jan 19 09:23:40 EST 2010

( while sleep 2; do
    date;
done )
Tue Jan 19 09:23:42 EST 2010
Tue Jan 19 09:23:44 EST 2010
Tue Jan 19 09:23:46 EST 2010
^C

Наш список команд запускается в виде задания с номером 2 и идентификатором PID 4856. Каждые две секунды запускается команда date, и на экран выводятся текущие дата и время. Данные, вводимые нами в листингах, выделены жирным шрифтом. Если вы печатаете медленно, то прежде чем вы закончите набирать команду, между вводимыми вами символами могут появляться строки вывода. Действительно, вы можете заметить, что символы 'f' и 'g', которые мы напечатали для перевода списка в приоритетный режим, разделены несколькими строками. Когда, наконец, команда fg напечатана, интерпретатор bash показывает команду, которая в текущий момент работает в нем, а именно, наш список команд, который продолжает выводить время каждые две секунды.

Как только вы перевели задание в приоритетный режим, вы можете завершить его (или убить командой kill) или выполнить над ним какое-либо другое действие. В нашем случае давайте нажмем Ctrl-c и остановим наши 'часы'.

Вы можете поинтересоваться, почему это задание выполнялось под номером 2? Когда мы закрыли наши аналоговые часы, в системе продолжало выполняться единственное задание с номером 1. Таким образом, новому заданию (нашим самодельным часам) был присвоен следующий доступный номер, то есть, 2.

Стандартный ввод/вывод и фоновые процессы

В предыдущем листинге вывод команды date прерывался символами, отображаемыми при вводе нами команды fg. Это наводит на интересный вопрос: как будет работать фоновый процесс, если он должен получать ввод с устройства stdin?

Терминальный процесс, в котором мы запускаем фоновое приложение, называется управляющим терминалом . До тех пор, пока потоки stdout и stderr фонового процесса не будут перенаправлены в другое место, они направляются на управляющий терминал. Аналогично, фоновая задача ожидает ввода данных с управляющего терминала, однако управляющий терминал не может направлять вводимые вами символы в поток stdin фонового процесса. В этом случае командный интерпретатор bash приостанавливает процесс. Вы можете перевести этот процесс в приоритетный режим и передать ему на вход все необходимые данные. В листинге 7 приведен простой пример, в котором вы можете переключить список команд в фоновый режим. Подождите пару секунд и нажмите клавишу Enter - вы увидите, что процесс остановился. Переключите этот процесс в приоритетный режим и введите строку данных, после чего нажмите Ctrl-d, обозначив конец ввода. Выполнение списка команд завершается и на экран выводится созданный нами файл.

Листинг 7. Ожидание потока stdin

ian@attic4:~$ (date; cat - > bginput.txt;date)&
[2] 5070
ian@attic4:~$ Tue Jan 19 10:33:13 EST 2010


[2]+  Stopped                 ( date; cat - > bginput.txt; date )
ian@attic4:~$ 
ian@attic4:~$ fg
( date; cat - > bginput.txt; date )
some text
more text
Tue Jan 19 10:33:31 EST 2010
ian@attic4:~$ cat bginput.txt
some text
more text

Продолжение работы процесса после выхода из системы

На практике вам может потребоваться, чтобы стандартные потоки ввода/вывода фоновых процессов перенаправлялись в файл или из файла. Возникает другой вопрос: что произойдет с процессом, если управляющий терминал будет закрыт или пользователь выйдет из системы? Ответ зависит от того, какой командный интерпретатор вы используете. Если интерпретатор посылает сигнал SIGHUP (или hangup), то, вероятнее всего, приложение закроется. Я кратко расскажу вам о сигналах чуть позже, а сейчас рассмотрим другой способ решения этой проблемы.

Команда nohup

Команда nohup используется для запуска команды, которая будет игнорировать сигналы hangup и добавлять потоки stdout и stderr в файл. По умолчанию этим файлом является либо nohup.out, либо $HOME/nohup.out. При отсутствии возможности записи в файл в файл команда не запустится. Если вы хотите перенаправлять вывод в какое-то другое место, то перенаправьте поток stdout или stderr так, как это описано в статье "Изучаем Linux, 101: потоки, программные каналы и перенаправления".

Команду nohup нельзя использовать для запуска конвейера или списка команд. Вы можете сохранить конвейер или список команд в файл, а затем запустить его на выполнение с помощью интерпретаторов sh (командная оболочка по умолчанию) или bash. В одной из статей нашей серии мы покажем, как сделать файл сценария исполняемым, а сейчас рассмотрим выполнение сценариев с помощью sh или bash. В листинге 8 показано, как это можно было бы сделать для наших текстовых цифровых часов. Излишне говорить о том, что запись времени в файл не приносит особой пользы, и что размер файла при этом постоянно увеличивается, поэтому давайте будем обновлять наши часы не каждую секунду, а каждые 30 секунд.

Листинг 8. Использование nohup и списка команд в сценарии

ian@attic4:~$ echo "while sleep 30; do date;done">pmc.sh 
ian@attic4:~$ nohup sh pmc.sh&
[2] 5485
ian@attic4:~$ nohup: ignoring input and appending output to `nohup.out'

ian@attic4:~$ nohup bash pmc.sh&
[3] 5487
ian@attic4:~$ nohup: ignoring input and appending output to `nohup.out'

Посмотрев на содержимое файла nohup.out, мы увидим в нем строки; если взять две любые строки, находящиеся через строку друг от друга, то время их записи в файл будет отличаться примерно на 30 секунд, как показано в листинге 9.

Листинг 9. Вывод процессов, запущенных при помощи nohup

ian@attic4:~$cat nohup.out
Tue Jan 19 15:01:12 EST 2010
Tue Jan 19 15:01:26 EST 2010
Tue Jan 19 15:01:44 EST 2010
Tue Jan 19 15:01:58 EST 2010
Tue Jan 19 15:02:14 EST 2010
Tue Jan 19 15:02:28 EST 2010
Tue Jan 19 15:02:44 EST 2010
Tue Jan 19 15:02:58 EST 2010

Более ранние версии nohup не посылают статусное сообщение на управляющий терминал, поэтому, если вы допустили ошибку, то можете узнать о ней только позже. Такое поведение вы можете увидеть в том случае, если перенаправите оба потока stdout и stderr в файл, который выберете сами. Предположим, вы решили, что было бы проще запустить команду с помощью ., а не с помощью sh или bash. В листинге 10 показано, что произойдет, если использовать nohup так же, как и ранее, но при этом перенаправить оба потока stdout и stderr. После того, как вы введете команду, появится сообщение о том, что задание 4 было запущено с идентификатором PID 5853. Но если нажать клавишу Enter снова, то появится другое сообщение о том, что задание было завершено с кодом завершения 126.

Листинг 10. Неправильное использование nohup

ian@attic4:~$ nohup . pmc.sh >mynohup.out 2>&1 &
[4] 5853
ian@attic4:~$ 
[4]+  Exit 126                nohup . pmc.sh > mynohup.out 2>&1

В листинге 11 показано содержимое файла mynohup.out. На самом деле, ничего удивительного. Вы используете nohup для запуска команды в фоновом режиме и используете source (.) для считывания команд из файла и последующего их запуска в контексте текущего интерпретатора. Здесь важно помнить о том, что вам может потребоваться нажать клавишу Enter, чтобы интерпретатор смог отобразить статус завершения фонового задания, а также заглянуть в файл результатов nohup, чтобы понять, что же пошло не так.
Листинг 11. Скрытые сообщения nohup

ian@attic4:~$ cat mynohup.out
nohup: ignoring input
nohup: cannot run command `.': Permission denied

Теперь давайте обратим внимание на статус наших процессов. Если вы выполняли все наши примеры и сейчас собираетесь передохнуть, то, пожалуйста, не спешите, потому что у нас остались еще две задачи, которые создадут еще большие файлы в вашей системе. Вы можете использовать команду fg для переключения каждой из них в приоритетный режим и комбинацию Ctrl-c для их останова, но если вы позволите им выполняться подольше, то вы увидите другие способы мониторинга и взаимодействия с ними.

Мониторинг процессов

Чуть раньше вы вкратце познакомились с командой jobs и узнали, как использовать ее для вывода списка идентификаторов PID для наших заданий.

Команда ps

Существует и другая команда, отображающая различную информацию о статусе процесса - команда ps (аббревиатура "process status" - статус процесса). Команда ps принимает в качестве аргументов ноль или более идентификаторов PID и отображает статус соответствующих процессов. Если запустить команду jobs с опцией -p, то ее вывод будет представлять собой идентификатор лидера группы процессов каждого задания. Мы будем использовать этот вывод в качестве аргументов команды ps, как показано в листинге 12.

Листинг 12. Статус фоновых процессов

ian@attic4:~$ jobs -p
3878
5485
5487
ian@attic4:~$ ps $(jobs -p)
  PID TTY      STAT   TIME COMMAND
 3878 pts/1    S      0:06 xclock -d -update 1
 5485 pts/1    S      0:00 sh pmc.sh
 5487 pts/1    S      0:00 bash pmc.sh

Если вы запустите команду ps без каких-либо опций, то вы увидите список процессов, для которых ваш терминал является управляющим терминалом, как показано в листинге 13. Обратите внимание на то, что команды pmc.sh в этом списке не отображаются. Совсем скоро вы узнаете, почему.

Листинг 13. Отображение статуса с помощью ps

ian@attic4:~$ ps
  PID TTY          TIME CMD
 2643 pts/1    00:00:00 bash
 3878 pts/1    00:00:06 xclock
 5485 pts/1    00:00:00 sh
 5487 pts/1    00:00:00 bash
 6457 pts/1    00:00:00 sleep
 6467 pts/1    00:00:00 sleep
 6468 pts/1    00:00:00 ps

Некоторые опции, включая -f (full - полный), -j (jobs - задания) и -l (long - длинный) позволяют управлять количеством выводимой информации. Если вы не указываете никакие идентификаторы PID, то другой полезной опцией является опция --forest, отображающая команды в виде дерева и показывающая, какие процессы являются родительскими для других процессов. В частности, можно увидеть, что команды sleep из предыдущих листингов являются дочерними процессами сценариев, запущенных вами в фоновом режиме. Если вы запустите эту команду в другой момент времени, то вы можете увидеть в списке процессов команду date, однако такая вероятность для этого сценария очень мала. Примеры использования некоторых опций приведены в листинге 14.

Листинг 14. Более подробная информация о статусах процессов

ian@attic4:~$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
ian       2643  2093  0 Jan18 pts/1    00:00:00 bash
ian       3878  2643  0 09:17 pts/1    00:00:06 xclock -d -update 1
ian       5485  2643  0 15:00 pts/1    00:00:00 sh pmc.sh
ian       5487  2643  0 15:01 pts/1    00:00:00 bash pmc.sh
ian       6635  5485  0 15:41 pts/1    00:00:00 sleep 30
ian       6645  5487  0 15:42 pts/1    00:00:00 sleep 30
ian       6647  2643  0 15:42 pts/1    00:00:00 ps -f
ian@attic4:~$ ps -j --forest
  PID  PGID   SID TTY          TIME CMD
 2643  2643  2643 pts/1    00:00:00 bash
 3878  3878  2643 pts/1    00:00:06  \_ xclock
 5485  5485  2643 pts/1    00:00:00  \_ sh
 6657  5485  2643 pts/1    00:00:00  /   \_ sleep
 5487  5487  2643 pts/1    00:00:00  \_ bash
 6651  5487  2643 pts/1    00:00:00  /   \_ sleep
 6658  6658  2643 pts/1    00:00:00  \_ ps

Теперь, когда у вас есть некоторые базовые инструменты мониторинга процессов (команды jobs и ps), давайте кратко рассмотрим две другие команды, а затем перейдем к рассмотрению других способов выбора и сортировки процессов, информацию о которых вы хотите получить.

Команда free

Команда free отображает количество свободной и используемой памяти вашего компьютера. По умолчанию значения выводятся в килобайтах, но можно изменить это с помощью различных опций: -b (выводить значения в байтах), -k (выводить значения в килобайтах), -m (выводить значения в мегабайтах) или -g (выводить значения в гигабайтах). Опция -t выводит суммарную строку, а опция -s обновляет информацию с указанной периодичностью (время указывается в секундах, но может представлять собой и значение с плавающей точкой). В листинге 15 приведены два примера.

Листинг 15. Использование команды free

ian@attic4:~$ free
             total       used       free     shared    buffers     cached
Mem:       4057976    1543164    2514812          0     198592     613488
-/+ buffers/cache:     731084    3326892
Swap:     10241428          0   10241428
ian@attic4:~$ free -mt
             total       used       free     shared    buffers     cached
Mem:          3962       1506       2456          0        193        599
-/+ buffers/cache:        713       3249
Swap:        10001          0      10001
Total:       13964       1506      12457

Команда uptime

Команда uptime показывает вам строку со следующей информацией: текущее время, время непрерывной работы системы, количество подключенных пользователей и средняя загрузка системы за последние 1, 5 и 15 минут. Пример команды показан в листинге 16.

Листинг 16. Информация, выводимая командой uptime

ian@attic4:~$ uptime
 17:41:17 up 20:03,  5 users,  load average: 0.00, 0.00, 0.00

Выбор и сортировка отображаемых процессов

Использование команды ps

До сих пор мы использовали команду ps для отображения процессов, запущенных нами в сеансе работы с терминалом (обратите внимание на столбец SID, т. е. идентификатор сеанса, во втором примере листинга 14). Если вам необходимо видеть все процессы управляющего терминала, то используйте для этого опцию -a. Опция -x отображает процессы без управляющего терминала, а опция -e - информацию о каждом процессе. В листинге 17 показан вывод информации обо всех процессах управляющего терминала в полном формате.

Листинг 17. Отображение остальных процессов

                
ian@attic4:~$ ps -af
UID        PID  PPID  C STIME TTY          TIME CMD
ian       3878  2643  0 09:17 pts/1    00:00:06 xclock -d -update 1
ian       5485  2643  0 15:00 pts/1    00:00:00 sh pmc.sh
ian       5487  2643  0 15:01 pts/1    00:00:00 bash pmc.sh
ian       7192  5485  0 16:00 pts/1    00:00:00 sleep 30
ian       7201  5487  0 16:00 pts/1    00:00:00 sleep 30
ian       7202  2095  0 16:00 pts/0    00:00:00 ps -af

Обратите внимание на управляющий терминал, перечисленный в столбце TTY. В этом примере я переключился в окно терминала, которое было открыто мной изначально (pts/0), поэтому команда ps -af выполняется в терминале pts/0, а все команды, созданные специально для нашего примера, выполняются в терминале pts/1.

Команда ps имеет много опций, включая несколько опций, позволяющих гибко управлять тем, какие поля выводятся на экран, и каким образом. Другие опции позволяют выбирать выводимые на экран процессы, например, можно выбрать только процессы определенного пользователя (опция -u) или процессы, связанные с определенной командой (опция -C). В листинге 18 перечислены все процессы, связанные с запущенной командой getty; с помощью опции -o мы выбираем столбцы, которые должны быть отображены в выводе. Также была добавлена опция user, позволяющая видеть пользователя, запустившего команду getty.
Листинг 18. Кто запустил команду getty?

ian@attic4:~$ ps -C getty -o user,pid,tty,time,comm
USER       PID TT           TIME COMMAND
root      1192 tty4     00:00:00 getty
root      1196 tty5     00:00:00 getty
root      1209 tty2     00:00:00 getty
root      1219 tty3     00:00:00 getty
root      1229 tty6     00:00:00 getty
root      1731 tty1     00:00:00 getty

Иногда может потребоваться отсортировать вывод по определенным полям. Для этого с помощью опции -sort вы можете указать поля, по которым будет выполняться сортировка. По умолчанию сортировка выполняется по возрастанию (+), но можно задать и сортировку по убыванию (-). В листинге 19 приведен итоговый пример команды ps, в котором все процессы перечислены в формате заданий, а вывод отсортирован по идентификаторам сеансов и именам команд. Во втором случае мы использовали сортировку по умолчанию, а в первом случае указали порядок сортировки для каждого поля явным образом.

Листинг 19. Сортировка вывода команды ps

ian@attic4:~$ ps -aj --sort -sid,+comm
  PID  PGID   SID TTY          TIME CMD
 5487  5487  2643 pts/1    00:00:00 bash
 9434  9434  2643 pts/1    00:00:00 ps
 5485  5485  2643 pts/1    00:00:00 sh
 9430  5485  2643 pts/1    00:00:00 sleep
 9433  5487  2643 pts/1    00:00:00 sleep
 3878  3878  2643 pts/1    00:00:10 xclock
 8019  8019  2095 pts/0    00:00:00 man
 8033  8019  2095 pts/0    00:00:00 pager
ian@attic4:~$ ps -aj --sort sid,comm
  PID  PGID   SID TTY          TIME CMD
 8019  8019  2095 pts/0    00:00:00 man
 8033  8019  2095 pts/0    00:00:00 pager
 5487  5487  2643 pts/1    00:00:00 bash
 9435  9435  2643 pts/1    00:00:00 ps
 5485  5485  2643 pts/1    00:00:00 sh
 9430  5485  2643 pts/1    00:00:00 sleep
 9433  5487  2643 pts/1    00:00:00 sleep
 3878  3878  2643 pts/1    00:00:10 xclock

Как обычно, полную информацию о команде ps и ее многочисленных опциях, вы можете найти на man-страницах; краткую справку можно получить по команде ps --help.

Использование команды top

Если вы хотите отслеживать изменения и для этого запускаете команду ps несколько раз подряд, то, возможно, лучшим решением окажется команда top. Эта команда отображает постоянно обновляющийся список процессов, а также полезную суммарную информацию. В листинге 20 показаны первые несколько строк вывода команды top. Используйте подкоманду q для закрытия top.

Листинг 20. Вывод информации о процессах с помощью top

top - 16:07:22 up 18:29,  5 users,  load average: 0.03, 0.02, 0.00
Tasks: 170 total,   1 running, 169 sleeping,   0 stopped,   0 zombie
Cpu(s):  2.1%us,  0.5%sy,  0.0%ni, 97.4%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4057976k total,  1543616k used,  2514360k free,   194648k buffers
Swap: 10241428k total,        0k used, 10241428k free,   613000k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 6820 ian       20   0  506m  78m  26m S    1  2.0   0:23.97 firefox
 1381 root      20   0  634m  40m  18m S    1  1.0   2:06.74 Xorg
 2093 ian       20   0  212m  15m  10m S    1  0.4   0:13.53 gnome-terminal
 6925 ian       20   0 1118m 298m  19m S    1  7.5   1:07.04 java
 6855 ian       20   0 73416  11m 8808 S    1  0.3   0:05.01 npviewer.bin
 7351 ian       20   0 19132 1364  980 R    0  0.0   0:00.07 top
    1 root      20   0 19584 1888 1196 S    0  0.0   0:00.74 init
    2 root      15  -5     0    0    0 S    0  0.0   0:00.01 kthreadd


Команда top имеет несколько подкоманд, наиболее полезными из которых являются:

h
вывод справочной информации.
q
завершение работы команды top.
f
добавление или удаление отображаемых полей.
o
сортировка порядка вывода информации.
F
выбор полей, по которым выполняется сортировка.

Полную информацию о команде top (в том числе о том, как выполнить сортировку по количеству использования оперативной памяти, а также на основе других критериев) вы можете найти на man-страницах. В листинге 21 приведен пример, в котором вывод отсортирован по количеству использованной виртуальной памяти в порядке убывания.

Листинг 21. Сортировка вывода команды top

top - 16:21:48 up 18:43,  5 users,  load average: 0.16, 0.06, 0.01
Tasks: 170 total,   3 running, 167 sleeping,   0 stopped,   0 zombie
Cpu(s):  2.1%us,  0.8%sy,  0.0%ni, 96.6%id,  0.0%wa,  0.0%hi,  0.5%si,  0.0%st
Mem:   4057976k total,  1588940k used,  2469036k free,   195412k buffers
Swap: 10241428k total,        0k used, 10241428k free,   613056k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
 6925 ian       20   0 1171m 338m  21m S    0  8.5   1:44.10 java               
 1381 root      20   0  634m  40m  18m S    0  1.0   2:13.63 Xorg                
 6820 ian       20   0  506m  83m  26m S    3  2.1   0:51.28 firefox            
 2004 ian       20   0  436m  23m  15m S    0  0.6   0:01.55 nautilus           
 2031 ian       20   0  419m  13m  10m S    0  0.3   0:00.11 evolution-alarm    
 2118 ian       20   0  372m  10m 7856 S    0  0.3   0:00.06 evolution-data-    
 2122 ian       20   0  344m  13m  10m S    0  0.3   0:00.10 evolution-excha    
 2001 ian       20   0  331m  22m  14m S    0  0.6   0:13.61 gnome-panel        
 1971 ian       20   0  299m 9.9m 7244 S    0  0.3   0:05.00 gnome-settings-    
 1989 ian       20   0  288m  15m  11m S    0  0.4   0:11.95 metacity           
 1954 ian       20   0  265m 5460 3412 S    0  0.1   0:00.28 pulseaudio         

Отправка сигналов процессам

Давайте теперь рассмотрим сигналы Linux, которые являются асинхронным средством взаимодействия с процессами. Мы уже упоминали о сигнале SIGHUP, а также использовали комбинации клавиш Ctrl-c и Ctrl-z, которые являются еще одним способом отправки сигналов процессам. Главным же способом отправки сигналов является команда kill.

Sending signals using kill

Команда kill посылает сигнал определенному заданию или процессу. В листинге 22 приведен пример использования сигналов SIGTSTP и SIGCONT для остановки и перезапуска фонового задания. Использование сигнала SIGTSTP эквивалентно использованию команды fg, переводящей задание в приоритетный режим, и последующему использованию Ctrl-z для его приостановки. Использование сигнала SIGCONT эквивалентно использованию команды bg.

Листинг 22. Остановка и перезапуск фоновых заданий

                
ian@attic4:~$ kill -s SIGTSTP %1

[1]+  Stopped                 xclock -d -update 1
ian@attic4:~$ jobs -l
[1]+  3878 Stopped                 xclock -d -update 1
[2]   5485 Running                 nohup sh pmc.sh &
[3]-  5487 Running                 nohup bash pmc.sh &
ian@attic4:~$ kill -s SIGCONT 3878
ian@attic4:~$ jobs -l
[1]   3878 Running                 xclock -d -update 1 &
[2]-  5485 Running                 nohup sh pmc.sh &
[3]+  5487 Running                 nohup bash pmc.sh &

В нашем примере мы использовали номер задания (%1) для остановки процесса xclock и идентификатор процесса (PID) для его перезапуска (возобновления). Если остановите задание %2 и затем воспользуетесь командой tail с опцией -f (слежение за процессом), то вы увидите, что в файле nohup.out обновляется только один процесс.

Существует ряд других сигналов, которые можно отобразить с помощью команды kill -l. Некоторые из них используются для сообщения об ошибках, например, о неверных кодах операций, исключениях при работе с плавающей точкой или попытках получить доступ к области памяти, недоступной для процесса. Обратите внимание на то, что сигналы имеют как имена (например, SIGTSTP), так и номера (например, 20). Вы можете использовать либо знак -, после которого указывается номер сигнала, либо опцию -s, после которой указывается его имя. В моей системе вместо команды kill -s SIGTSTP я мог бы использовать команду kill -20. Прежде чем использовать номера сигналов, всегда следует проверять, какому сигналу сопоставлен тот или иной номер, поскольку в различных системах эти сопоставления быть разными.

Обработчики сигналов и завершение процессов

Вы уже видели, что нажатие Ctrl-c завершает процесс. Фактически, эта комбинация клавиш посылает процессу сигнал SIGINT (или interrupt - прервать). Если вы используете команду kill и не указываете имя сигнала, то процессу посылается сигнал SIGTERM. Для большинства задач эти два сигнала эквивалентны.

Вы также видели, что команда nohup позволяет процессам игнорировать сигналы SIGHUP. В общем случае в процессе может быть реализован обработчик сигналов , перехватывающий их. Таким образом, в процессе может быть реализован обработчик для перехвата сигналов SIGINT или SIGTERM. Поскольку обработчик сигналов знает о том, какой сигнал был получен, он может проигнорировать сигнал SIGINT и завершить приложение только при получении, например, сигнала SIGTERM. В листинге 23 приведен пример, в котором показано, как послать сигнал SIGTERM заданию %2. Заметьте, что сразу же после того, как был послан сигнал, статус процесса изменился на "Terminated". Если бы мы послали сигнал SIGINT, то статус процесса изменился бы на "Interrupt". Спустя пару мгновений наступает очистка процессов, и задание больше не отображается в списке.

Листинг 23. Завершение процесса с помощью SIGTERM

ian@attic4:~$ kill -s SIGTERM %2
ian@attic4:~$ 
[2]-  Terminated              nohup sh pmc.sh
ian@attic4:~$ jobs -l
[1]-  3878 Running                 xclock -d -update 1 &
[3]+  5487 Running                 nohup bash pmc.sh &

Обработчики сигналов придают процессам значительную гибкость. Процесс может выполнять свою обычную работу и прерываться по сигналу в определенных целях. Помимо того, что сигналы позволяют процессам перехватывать запросы на завершение работы и выполнять определенные действия (например, закрывать файлы или устанавливать контрольные точки в выполняющихся транзакциях), они часто используются для того, чтобы сообщить процессам-демонам о необходимости заново считать конфигурационный файл или выполнить перезапуск. Например, можно послать определенный сигнал процессу inetd, если вы изменили параметры сети, или демону печати (lpd) после того, как вы добавили новый принтер.

Безусловное завершение процесса

Некоторые сигналы не могут быть перехвачены (например, некоторые исключения аппаратного уровня). Сигнал SIGKILL, который вы, вероятно, будете использовать, не может быть перехвачен обработчиком сигналов и безусловно завершает процесс. Вообще, этот сигнал следует использовать только в том случае, если все другие попытки завершить процесс оказались безрезультатными.

Команды logout и nohup

Вспомните о том, что команда nohup позволяет процессам продолжать свою работу даже после того, как вы вышли из системы. Давайте так и поступим, а потом снова войдем в систему. После того, как вы выполните повторный вход в систему, проверьте ваш процесс (простые цифровые часы) с помощью команд jobs и ps, как мы делали это раньше. Вывод представлен в листинге 24.

Листинг 24. Повторный вход в систему

ian@attic4:~$ jobs -l
ian@attic4:~$ ps -a
  PID TTY          TIME CMD
10995 pts/0    00:00:00 ps

На этот раз мы работаем в терминале pts/0, но не видим никаких признаков нашего задания, только команду ps. Это не совсем то, чего мы ожидали, однако не все еще потеряно. Предположим, что вы не можете вспомнить, завершили ли вы работу задания, запущенного в bash в режиме nohup, или работу обычного задания, запущенного, опять же, в bash. Вы уже видели, как можно найти работающие процессы команды getty, поэтому вы можете использовать этот же прием для вывода идентификаторов SID, PID, PPID и строки команд. Затем вы можете использовать опцию -js для отображения всех процессов сеанса. Результат представлен в листинге 25. Подумайте о других способах, позволяющих найти эти процессы - например, поиск по имени пользователя с последующей фильтрацией через grep.

Листинг 25. Поиск потерянных команд

                
ian@attic4:~$ ps -C bash -C sh -o pid,sid,tname,cmd
  PID   SID TTY      CMD
 5487  2643 ?        bash pmc.sh
 7050  7050 pts/3    -bash
10851 10851 pts/0    bash
ian@attic4:~$ ps -js 2643
  PID  PGID   SID TTY          TIME CMD
 5487  5487  2643 ?        00:00:00 bash
11197  5487  2643 ?        00:00:00 sleep

Заметьте, что процесс pmc.sh продолжает выполняться, но теперь он содержит знак вопроса (?), который означает управляющий терминал TTY.

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


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=29148