Библиотека сайта rus-linux.net
Предыдущий | Содержание | Следующий |
5.4 Управление процессами
Любая выполняемая программа называется процессом. Всё от X Winow системы, до системных программ (демонов), которые запускаются при включении компьютера, является процессом. Каждый процесс запускается от имени какого-то пользователя. Процессы, которые стартовали при загрузке обычно выполняются от имени root пользователя, или от имени пользователя nobody. Процессы запущенные вами, обычно выполняются от вашего имени. Процессы, начатые другими пользователями, работают под их именем.
Вы можете управлять теми процессами, которые вы запустили. Вдобавок к этому, root может управлять всеми процессами в системе, даже теми, которые выполняются другими пользователями. Процессами можно управлять и наблюдать за ними при помощи специальных программ, а так же при помощи некоторых команд оболочки.
5.4.1 Перевод в фоновый режим
Программы, запущенные из командной строки обычно выполняются на переднем плане (foreground). Это позволяет вам видеть весь вывод программы и взаимодействовать с ней. Но бывают такие случаи, когда вам не хочется, чтобы программа занимала ваш терминал. Это называется выполнением программы в фоновом режиме (foreground), и существует несколько способов перевода программ в фоновый режим.
Первый способ перевода программы в фоновый режим, это добавление символа & в конце строки, запускающей программу. Предположим, вы хотите воспользоваться mp3 проигрывателем amp для проигрывания файлов из каталога, заполненного mp3 файлами, но вам не хочется занимать для этого терминал, так как вам надо делать что-то ещё в то же самое время. Следующая команда запустит amp в фоновом режиме:
$ amp *.mp3 &
|
Программа будет выполняться, как и должна, а вы вернётесь в приглашение командной строки.
Другой способ перевода программы в фоновый режим, позволяет проделать это уже во время выполнения программы. Вначале запустите программу. Нажмите control+z. Это приостановит процесс. Что-то вроде паузы. Программа моментально прекратит выполняться, но может в любой момент быть продолжена. Как только вы приостановили процесс, вы возвращаетесь к приглашению командной строки. Для перевода процесса в фоновый режим, наберите:
$ bg
|
И таким образом, приостановленный процесс перейдёт в фоновый режим.
5.4.2 Вывод из фонового режима
Если вам понадобилось взаимодействовать с фоновым процессом, вы можете вернуть его на передний план. Если у вас только один фоновый процесс, вы можете вернуть его, напечатав:
$ fg
|
Программа опять займёт ваш терминал и вы лишитесь приглашения командной строки. Иногда, случается, что программа, выполняемая в фоновом режиме завершает свою работу. В этом случае вы получите сообщение такого вида:
[1]+ Done /bin/ls $LS_OPTIONS |
Это говорит вам что фоновый процесс (в данном случае ls - не очень интересно), завершился.
Возможно так же одновременно выполнять несколько процессов в фоновом режиме. Если это так, вам надо знать, какой из процессов вы хотите вернуть на передний план. Простое выполнение fg вернёт процесс, который последним был переведён в фоновый режим. А что если у вас целый список процессов в фоновом режиме? К счастью, bash имеет команду для перечисления всех процессов. Она называется jobs и её вывод выглядит примерно так:
$ jpbs |
[1] Stopped vim |
[2]- Stopped amp |
[3]+ Stopped man ps |
Это выдаст вам список всех фоновых процессов. Как видите, все они остановлены. А ещё точнее, приостановлены. Номера это что-то вроде ID для всех фоновых процессов. Если возле номера отображается знак плюс (man ps), это означает, что этот процесс будет выведен из фонового режима по команде fg без указания аргументов.
Если же вы захотите перевести на передний план vim, вам придётся напечатать:
$ fg 1
|
и vim выпрыгнет обратно на ваш экран. Переведение процессов в фоновый режим может быть очень полезно, если у вас есть всего один терминал, открытый через dialup соединение. Вы можете одновременно выполнять несколько программ и переключаться между ними в любой последовательности.
5.4.3 ps
Итак, вы знаете, как переключаться между запущенными вами из командной строки фоновыми процессами. Так же вы знаете, что есть ещё много других процессов, которые всё время выполняются. Как же посмотреть их список? Вам надо воспользоваться ps(1) командой. У неё есть множество различных опций, здесь будут описаны лишь самые основные. Для подробной информации смотрите man страницу для ps. Man страницы описаны в разделе 2.2.1.Простой набор ps выдаст список программ, выполняемых на терминале. Довольно часто этот список будет невелик:
$ ps
|
PID | TTY | TIME | CMD |
7923 | ttyp0 | 00:00:00 | bash |
8059 | ttyp0 | 00:00:00 | ps |
Не смотря на то, что процессов немного, информация довольно типичная. Сколько бы у вас не было процессов, при простом использовании ps столбцы будут теми же. Что же означает вся эта информация?
Итак, по порядку: PID это идентификационный номер (ID) процесса. Каждый выполняющийся процесс получает уникальный идентификатор. В 2.2.х ядрах ID процессов может быть любым числом от 1 и до 32767. Каждому процессу присваивается следующий свободный PID. Когда процесс завершается, его номер освобождается. Когда достигнут максимальный PID, следующий свободный будет взят из наименьшего освобождённого. Скорее всего, это изменится в ядре 2.4, и будут представлены новые 32-х битовые PID.
TTY столбец показывает, на каком терминале процесс выполняется. Простое выполнение ps покажет процессы выполняемые на текущем терминале, так что для всех процессов будет выведена идентичная информация в TTY столбце. Как видно из примера, оба показанных процесса выполняются на терминале ttyp0. Это говорит нам о том, что эти процессы запущены либо удалённо, либо из какого-то X терминала.
Столбец TIME показывает, сколько процессорного времени выполняется процесс. Оно не является фактическим временем, с момента запуска процесса. Помните, что Linux это многозадачная операционная система. В любой момент времени есть несколько выполняемых процессов, и каждый из этих процессов получает небольшую порцию процессорного времени. Так вот, информация указанная в столбце TIME, показывает время, которое гораздо меньше фактического времени выполнения процесса. Если вы это время больше, чем несколько минут у одного из процессов, то скорее всего, что-то не так.
Ну и наконец, CMD столбец, показывает что же это за программа. Отображается только имя программы; опции командной строки и аналогичная информация не выводится. Для того чтобы увидеть эту информацию, вам необходимо воспользоваться одной из многих опций программы ps. Давайте обсудим некоторые из них вкратце.
Вы можете получить полный список выполняемых в вашей системе процессов, воспользовавшись правильным набором опций. Скорее вы захотите вывести расширенный список процессов. Давайте попробуем:
$ ps -ax
|
PID | TTY | STAT | TIME | COMMAND |
1 | ? | S | 0:03 | init [3] |
2 | ? | SW | 0:13 | [kflushd] |
3 | ? | SW | 0:14 | [kupdate] |
4 | ? | SW | 0:00 | [kpiod] |
5 | ? | SW | 0:17 | [kswapd] |
11 | ? | S | 0:00 | /sbin/kerneld |
30 | ? | SW | 0:01 | [cardmgr] |
50 | ? | S | 0:00 | /sbin/rpc.portmap |
54 | ? | S | 0:00 | /usr/sbin/syslogd |
57 | ? | S | 0:00 | /usr/sbin/klogd -c 3 |
59 | ? | S | 0:00 | /usr/sbin/inetd |
61 | ? | S | 0:04 | /usr/local/sbin/sshd |
63 | ? | S | 0:00 | /usr/sbin/rpc.mountd |
65 | ? | S | 0:00 | /usr/sbin/rpc.nfsd |
67 | ? | S | 0:00 | /usr/sbin/crond -l10 |
69 | ? | S | 0:00 | /usr/sbin/atd -b 15 -l 1 |
77 | ? | S | 0:00 | /usr/sbin/apmd |
79 | ? | S | 0:01 | gpm -m /dev/mouse -t ps2 |
94 | ? | S | 0:00 | /usr/sbin/automount /auto file /etc/auto.misc |
106 | tty1 | S | 0:08 | -bash |
108 | tty3 | SW | 0:00 | [agetty] |
109 | tty4 | SW | 0:00 | [agetty] |
110 | tty5 | SW | 0:00 | [agetty] |
111 | tty6 | SW | 0:00 | [agetty] |
(output cut) |
Большинство из этих процессов запускаются при старте почти любого компьютера, работающего под Linux. В своей системе я сделал несколько изменений, так что вы скорее всего увидите что-то другое. Но всё же большинство из перечисленных процессов вы увидите в вашей системе. Как вы видите, опции заданные программе в этом примере, заставляют её выводить не только имена программ, но и опций с которыми они были выполнены. А так же ещё несколько новых столбцов с интересной информацией.
Наверное вам сразу бросится в глаза, что большинство из процессов выполняются на tty ''?''. Это процессы, запущенные с более не активного терминала. И поэтому они больше не принадлежат определённому терминалу.
Так же вы видите новый столбец: STAT. Он показывает состояние (status) процесса. S используется для спящего (sleeping) процесса: процесс ожидает, пока что-то произойдёт. Z используется для зомбиованных процессов (zombied). Это такие процессы, родительский процесс которых умер, оставив дочерние процессы рабочими. Это не есть хорошо.
Если вы хотите увидеть ещё больше информации о выполняемых процессах, попробуйте такую команду:
$ ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND |
root 1 0.0 0.0 344 80 ? S Mar02 0:03 init [3] |
root 2 0.0 0.0 0 0 ? SW Mar02 0:13 [kflushd] |
root 3 0.0 0.0 0 0 ? SW Mar02 0:14 [kupdate] |
root 4 0.0 0.0 0 0 ? SW Mar02 0:00 [kpiod] |
root 5 0.0 0.0 0 0 ? SW Mar02 0:17 [kswapd] |
root 11 0.0 0.0 1044 44 ? S Mar02 0:00 /sbin/kerneld |
root 30 0.0 0.0 1160 0 ? SW Mar02 0:01 [cardmgr] |
bin 50 0.0 0.0 1076 120 ? S Mar02 0:00 /sbin/rpc.port |
root 54 0.0 0.1 1360 192 ? S Mar02 0:00 /usr/sbin/sysl |
root 57 0.0 0.1 1276 152 ? S Mar02 0:00 /usr/sbin/klog |
root 59 0.0 0.0 1332 60 ? S Mar02 0:00 /usr/sbin/inet |
root 61 0.0 0.2 1540 312 ? S Mar02 0:04 /usr/local/sbi |
root 63 0.0 0.0 1796 72 ? S Mar02 0:00 /usr/sbin/rpc. |
root 65 0.0 0.0 1812 68 ? S Mar02 0:00 /usr/sbin/rpc. |
root 67 0.0 0.2 1172 260 ? S Mar02 0:00 /usr/sbin/cron |
root 77 0.0 0.2 1048 316 ? S Mar02 0:00 /usr/sbin/apmd |
root 79 0.0 0.1 1100 152 ? S Mar02 0:01 gpm |
root 94 0.0 0.2 1396 280 ? S Mar02 0:00 /usr/sbin/auto |
chris 106 0.0 0.5 1820 680 tty1 S Mar02 0:08 -bash |
root 108 0.0 0.0 1048 0 tty3 SW Mar02 0:00 [agetty] |
root 109 0.0 0.0 1048 0 tty4 SW Mar02 0:00 [agetty] |
root 110 0.0 0.0 1048 0 tty5 SW Mar02 0:00 [agetty] |
root 111 0.0 0.0 1048 0 tty6 SW Mar02 0:00 [agetty] |
(output cut) |
Это достаточно полный набор информации. Здесь вы видите новые столбцы, которые описывают: какой пользователь запустил процесс, сколько системных ресурсов использует процесс (%CPU, %MEM, VSZ и RSS столбцы), и дату, когда процесс был запущен. Очевидно, здесь предоставлено достаточно информации о процессах, которая может быть полезна для системного администратора. Так же мы встретились с ещё одной проблемой: информация не помещается на экране. Опция ''-w'' исправит это.
Вывод команды не очень красив, но весьма полезен работает. И всё же мы ещё не увидели всей доступной информации по выполняемым процессам. Есть ещё много разнообразной информации, которую вы можете получить о каждом из процессов. Загляните в man страницу для программы ps. Тем не менее, опции описанные в этом разделе являются наиболее часто применяемыми. И наверное вы будете пользоваться в основном ими.
5.4.4 kill
Иногда что-то не так происходит с программами и возникает необходимость восстановить порядок в системе. Программа, предоставляющая такой вид услуг, называется kill(1). Она может быть использована для манипулирования процессами несколькими разными способами. Наиболее часто программа применяется, чтобы убивать процессы. У вас появится необходимость в этом, если программа вышла из под контроля и забирает много системных ресурсов, или если вам просто не нравится, что эта программа осталась в памяти.
Для того, чтобы убить процесс, вам надо знать либо его PID, либо имя. Чтобы получить PID воспользуйтесь программой ps, как это обсуждалось в предыдущем разделе. Например, чтобы убить процесс 4747, вы зададите такую команду:
$ kill 4747
|
Для того, чтобы убить процесс, вам надо быть его хозяином. Это сделано в целях безопасности. Если бы вы могли убивать процессы других пользователей, открылась бы возможность произведения множества злонамеренных вещей в системе. Разумеется, root может убить любой процесс в системе.
Есть так же другая разновидность программы kill, которая называется killall(1). Функция программы соответствует её названию. Она убивает все из запущенных программ, с указанным именем. Если вы хотите убить все выполняемые vim процессы, вам следует воспользоваться такой командой:
$ killall vim
|
Все vim процессы, выполняемые вами будут убиты. Если вы выполните команду, как root, то она убьёт вообще все vim процессы, выполняемые любым из пользователей. Это предоставляет интересный способ выбрасывания всех (включая и вас) из системы:
# killall bash
|
Иногда обычное выполнение kill не справляется с поставленной задачей. Некоторые процессы не могут быть убиты обычной командой kill. Вам понадобиться воспользоваться более мощной версией. Если этот нудный процесс с PID4747 не умер после выполнения kill, вы можете попробовать следующее:
$ kill -9 4747
|
Практически наверняка, это заставит процесс 4747 умереть. Вы можете воспользоваться этим же ключом с killall программой. Этот ключ позволяет посылать различные сигналы программам. Обычный kill посылает процессу сигнал SIGTERM (terminate - завершиться). kill -9 посылает SIGKILL (kill - убить). В вашем распоряжении целый набор различных сигналов. Вы можете запросить список, выполнив:
$ kill -l |
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL |
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE |
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 |
13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD |
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN |
22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ |
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO |
30) SIGPWR |
Номера используются для kill, а имя без предшествующего ''SIG'' используется для killall. Вот ещё пример:
$ killall -KILL vim
|
Ещё один вариант использования kill это перезапуск процесса. Послав SIGHUP сигнал мы заставим процесс перечитать свои конфигурационные процессы. Это очень полезно, если вы изменили содержание настроечных файлов для какой-то программы.
5.4.5 top
Есть так же и программа, которую вы можете использовать для вывода динамической информации о процессах, выполняемых в системе. Программа называется top(1):
$ top
|
Эта команда выдаст полный экран информации о выполняемых процессах, а так же некоторую общую информацию о системе. Такую, как средняя загрузка, количество выполняемых процессов, состояние процессора, информацию о свободной памяти и для каждого из процессов - PID, пользователь, приоритет, использование CPU и памяти, время выполнения и имя программы.
Figure |
Называется она top потому, что программы, наиболее требовательные к процессору будут отражены в верху списка. top является довольно удобным инструментом для определения того, какая из программ вышла из под контроля и должна быть убита,
5.4.6 Итог
В этом разделе обсуждалось, что такое процессы и как вы можете ими управлять. Это включает выполнение в фоновом режиме, вывод из фонового режима, а так же использование ps, top, и kill для контроля за процессами. Вы должны уметь определить, какие процессы выполняются в вашей системе и знать, как вы можете от них избавиться, если они вышли из под контроля.
Предыдущий | Содержание | Следующий |
File translated from TEX by TTH, version 2.89.
On 24 Apr 2001, 16:43.