Управление процессами

Любая выполняемая программа в системе называется процессом. Все, от системы X Window до системных программ (демонов), которые запускаются при включении компьютера, является процессом. Каждый процесс запускается от имени какого-то пользователя. Процессы, которые были запущены при загрузке системы, обычно выполняются от имени пользователя root или от имени пользователя nobody. Процессы, запущенные пользователем, обычно выполняются от его имени.

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

Для управления процессами используются следующие команды:

 & - запуск программы в фоновом режиме;  
 <Ctrl>+<Z> - приостановка текущего процесса;  
 bg – перевод приостановленного процесса в фоновый режим;  
 fg – возврат процесса из фонового режима;  
 jobs – список процессов в фоновом режиме;  
 ps – список программ, выполняемых на терминале;  
 kill, killall – принудительное завершение процессов;  
 top – вывод динамической информации о процессах;  
 nice- изменение приоритета;  

Перевод в фоновый режим

Программы, запущенные из командной строки, обычно выполняются на переднем плане (foreground) и связаны с терминалом. Это позволяет пользователю видеть весь вывод программы и взаимодействовать с ней. Но бывают такие случаи, когда требуется, чтобы программа не занимала терминал, тогда ее запускают в фоновом режиме (foneground).

Существует несколько способов перевода программ в фоновый режим. Первый способ — это добавление символа & в конце строки, запускающей программу. Предположим, необходимо воспользоваться mp3-проигрывателем amp для проигрывания файлов из каталога, заполненного mp3-файлами, но пользователь не хочет, чтобы терминал был занят проигрывателем, так как ему в то же самое время надо делать что-то еще. Следующая команда запустит amp в фоновом режиме:

   $ amp *.mp3 &  

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

Другой способ позволяет переводить программы в фоновый режим уже во время их выполнения. После запуска программы необходимо нажать комбинацию клавиш <Ctrl>+<Z>. Это приостановит процесс (что-то вроде паузы). Программа моментально прекратит выполняться, но может в любой момент быть продолжена. Как только процесс будет приостановлен, терминал будет возвращен к приглашению командной строки и для перевода процесса в фоновый режим, необходимо ввести команду:

   $ bg  

Таким образом, приостановленный процесс будет переведен в фоновый режим.

Вывод из фонового режима

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

   $ fg  

Иногда случается, что программа, выполняемая в фоновом режиме, завершает свою работу. В этом случае будет выведено сообщение такого вида:

   [1]+  Done              /bin/ls $LS_OPTIONS  

Это указывает, что фоновый процесс (в данном случае ls) завершился.

В фоновом режиме может одновременно выполнять несколько процессов. При этом необходимо знать, какой из процессов требуется вернуть на передний план. Простое выполнение fg вернет процесс, который последним был переведен в фоновый режим. Для перечисления всех выполняющихся процессов в оболочке BASH имеется команда jobs. Например:

   $ jobs     [1] Stopped vim     [2]- Stopped amp     [3]+ Stopped man ps  

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

Если же требуется перевести на передний план vim, то придется ввести:

   $ fg 1  

В результате vim будет возвращен обратно на экран терминала. Перевод процессов в фоновый режим может быть очень полезен, если имеется всего один терминал, открытый через dialup-соединение. Это позволяет одновременно выполнять несколько программ и переключаться между ними в любой последовательности.

Список выполняемых программ

Простой ввод ps выдаст список программ, выполняемых на терминале. Довольно часто этот список будет невелик:

   $ ps     PID     TTY     TIME            CMD     7923    ttyp0   00:00:00        bash     8059    ttyp0   00:00:00        ps  

При использовании утилиты ps выводится следующая информация:

  • PID — идентификационный номер (ID) процесса. Каждый выполняющийся процесс получает уникальный идентификатор. В ядрах 2.4.х ID процессов может быть любым числом от 1 и до 232. Каждому новому процессу присваивается свободный PID;
  • TTY — идентификатор терминала, на котором выполняется процесс. Простое выполнение ps покажет процессы, выполняемые на текущем терминале, так что для всех процессов в столбце TTY будет выведена идентичная информация. Как видно из примера, оба показанных процесса выполняются на терминале ttyp0. Это говорит нам о том, что эти процессы запущены либо удаленно, либо из какого-то X-терминала;
  • TIME — счетчик процессорного времени выполнения процесса. Оно не является фактическим временем, с момента запуска процесса. Так как Linux многозадачная операционная система, то в любой момент времени есть несколько выполняемых процессов, и каждый из этих процессов получает небольшую порцию процессорного времени. Так вот, информация, указанная в столбце TIME, показывает время, которое гораздо меньше фактического времени выполнения процесса. Если это время больше, чем несколько минут у одного из процессов, то, скорее всего, что-то не так;
  • CMD — сведения о программе. Отображается только имя программы — опции командной строки и аналогичная информация не выводится. Для того чтобы увидеть эту информацию, необходимо воспользоваться дополнительными опциями при запуске ps.

Далее будут описаны некоторые наиболее часто используемые опции утилиты 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]

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

В системе большинство из процессов выполняются на устройстве "?". Это процессы, запущенные с более неактивного терминала. И поэтому они больше не принадлежат определенному терминалу.

Столбец 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]

Это достаточно полный набор информации. Здесь имеются новые столбцы, которые описывают следующее: какой пользователь запустил процесс, сколько системных ресурсов использует процесс (%CPU, %MEM, VSZ и RSS столбцы) и дату, когда процесс был запущен. Очевидно, здесь предоставлено достаточно информации о процессах, которая может быть полезна для системного администратора. В случае если информация не помещается на экран, следует использовать опцию -w.

Принудительное завершение процессов

Для принудительного завершения процессов в системе используется утилита kill. Необходимость в этом появляется, если процесс вышел из-под контроля, забирает много системных ресурсов или остался в памяти после завершения работы программы.

Для того чтобы принудительно завершить процесс, пользователю надо знать либо его PID, либо имя. Чтобы получить PID, можно воспользоваться утилитой ps. Например, чтобы завершить процесс 4747, необходимо задать такую команду:

   $ kill 4747  

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

Также имеется другая разновидность утилиты kill, которая называется killall. Функция утилиты соответствует ее названию. Она завершает все из запущенных программ, с указанным именем. Если требуется завершить все выполняемые процессы vim, то следует воспользоваться такой командой:

   $ killall vim  

Все процессы vim, выполняемые пользователем, будут завершены. Если эту команду выполнит root, то она принудительно завершит вообще все процессы vim, выполняемые любым из пользователей. Это предоставляет интересный способ "выбрасывания" всех пользователей из системы:

   #killall bash  

Некоторые процессы не могут быть завершены обычной командой kill, и понадобится воспользоваться дополнительными опциями. Если процесс с PID 4747 не завершился после выполнения 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 можно заставить процесс перечитать свои конфигурационные файлы. Это очень полезно, если для какой-то программы было изменено содержание конфигурационных файлов.

Динамическая информация о процессах

Утилита top обеспечивает вывод динамической информации о процессах, выполняемых в системе.

   $ top  

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

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