Краткий обзор
Из этой статьи вы узнаете об основных приемах управления процессами в 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
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
Листинг 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
.