Скачиваний:
19
Добавлен:
09.05.2014
Размер:
53.74 Кб
Скачать

Домашнее задание №3

Процессы

Выполнил

Студент гр. 2100

Голубцов Евгений

2008

PS

ps (от англ. process status) — программа в UNIX, Unix-подобных и других POSIX-совместимых операционных системах, выводящая отчёт о работающих процессах. Команда ps выдает информацию об активных процессах. По умолчанию информация дается только о процессах, ассоциированных с данным терминалом. Выводятся идентификатор процесса, идентификатор терминала, истраченное к данному моменту время ЦП и имя команды. Если нужна иная информация, следует пользоваться опциями.

Командой ps обрабатываются следующие опции:

-e Вывести информацию обо всех процессах.

-d Вывести информацию обо всех процессах, кроме лидеров групп.

-a Вывести информацию обо всех наиболее часто запрашиваемых процессах, то есть обо всех процессах, кроме лидеров групп и процессов, не ассоциированных с терминалом.

-f Генерировать полный листинг (см. ниже раз яснение смысла колонок).

-l Генерировать листинг в длинном формате (см. ниже).

-n файл_с_системой Считать, что операционная система загружена из файла_с_системой, а не из файла /unix.

-t список_терминалов Выдавать информацию только о процессах, ассоциированных с терминалами из заданного списка_терминалов. Терминал - это либо имя файла-устройства, например ttyномер или console, либо просто номер, если имя файла начинается с tty.

-p список_идентификаторов_процессов Выдавать информацию только об указанных процессах.

-u список_идентификаторов_пользователей Выдавать информацию только о процессах с заданными идентификаторами или входными именами пользователей. Идентификатор пользователя выводится в числовом виде, а при наличии опции -f - в символьном.

-g список_идентификаторов_лидеров_групп Выводить информацию только о процессах, для которых указаны идентификаторы лидеров групп. Лидер группы - это процесс, номер которого идентичен его идентификатору группы. Shell, запускаемый при входе в систему, является стандартным примером лидера группы.

При указании опции -f ps пытается определить имя команды и аргументы, с которыми был создан процесс, исследуя пользовательский блок процесса. Если это не удается, имя процесса выводится так же, как и при отсутствии опции -f, только заключается в квадратные скобки.

Ниже приводятся заголовки колонок выдачи и об ясняется смысл их содержимого. Буквы l или f в скобках означают, что эта колонка появляется соответственно при длинном или полном формате выдачи; отсутствие букв означает, что данная колонка выводится всегда. Отметим, что опции -l и -f влияют только на формат выдачи, но не на список процессов, информация о которых будет предоставлена.

F (l)

Флаги (шестнадцатеричные), логическая сумма которых дает следующие сведения о процессе:

00

Процесс терминирован; элемент таблицы процессов свободен.

01

Системный процесс: всегда в основной памяти.

02

Процесс трассируется родительским процессом.

04

Родительский трассировочный сигнал остановил процесс; родительский процесс ждет [см. ptrace(2)].

08

Процесс не может быть разбужен сигналом.

10

Процесс в основной памяти.

20

Процесс в основной памяти; блокирован до завершения события.

40

Идет сигнал к удаленной системе.

80

Процесс в очереди на ввод/вывод.

S (l)

Статус процесса:

O

Активный: обрабатывается процессором.

S

Спящий: ожидает завершения события.

R

Готов: стоит в очереди на выполнение.

I

Рождающийся: процесс создается.

Z

Состояние "зомби": процесс завершен, но родительский процесс не ждет этого.

T

Трассируемый: процесс остановлен сигналом, так как родительский процесс трассирует его.

X

Растущий: процесс ожидает получения большего об ема основной памяти.

UID (f,l)

Идентификатор владельца процесса; при указании опции -f выдается входное имя пользователя.

PID

Идентификатор процесса (необходим для терминирования процесса).

PPID (f,l)

Идентификатор родительского процесса.

C (f,l)

Доля выделенного планировщиком времени ЦП.

STIME (f)

Время запуска процесса (часы:минуты:секунды). Если процесс запущен более чем 24 часа назад, выдается месяц и день запуска.

PRI (l)

Приоритет процесса; большее число означает меньший приоритет.

NI (l)

Поправка к приоритету.

ADDR (l)

Адрес процесса в памяти.

SZ (l)

Размер (в блоках по 512 байт) образа процесса в памяти.

WCHAN (l)

Адрес события, которого ожидает процесс. У активного процесса эта колонка пуста.

TTY

Управляющий терминал (обычно - терминал, с которого был запущен процесс; см. ниже СЮРПРИЗЫ). Если такового нет, выдается символ ?.

TIME

Истраченное процессом время ЦП.

COMMAND

Имя программы; если указана опция -f, то выводится полное имя команды и ее аргументы.

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

Выводимая информация

Столбцы:

UID : идентификатор пользователя;

PID : идентификатор процесса;

PPID : идентификатор родительского процесса;

C : приоритет процесса, используемый планировщиком задач;

STIME : время старта процесса;

TTY : терминал, с которым связан данный процесс;

TIME : общее время работы процесса;

CMD : команда, запустившая данный процесс «с некоторыми опциями выводит и каталог откуда процесс был запущен»;

STAT : состояние, в котором на данный момент находится процесс.

Параметры STAT

R : процесс выполняется в данный момент

S : процесс ожидает выполнение (спит)

D : процесс в полной (непрерываемой) спячке, например, ожидает ввода/вывода

Z : zombie или defunct процесс, то есть процесс у которого нет родителя

T : процесс остановлен

W : процесс в свопе

< : процесс в приоритетном режиме.

N : процесс в режиме низкого приоритета

L : real-time процесс, имеются страницы, заблокированные в памяти.

Примеры использования

# ps

PID TTY TIME CMD

2643 pts/0 00:00:00 su

2644 pts/0 00:00:00 bash

3092 pts/0 00:00:00 ps

# ps ax

PID TTY STAT TIME COMMAND

1 ? S 0:01 init [3]

2 ? SN 0:00 [ksoftirqd/0]

3 ? S< 0:00 [events/0]

4 ? S< 0:00 [khelper]

5 ? S< 0:00 [kblockd/0]

29 ? S 0:00 [pdflush]

# ps af

PID TTY STAT TIME COMMAND

2617 pts/0 Ss 0:00 -bash

2643 pts/0 S 0:00 \_ su -

2644 pts/0 S 0:00 \_ -bash

3100 pts/0 R+ 0:00 \_ ps af

2176 tty6 Ss+ 0:00 /sbin/mingetty tty6

2175 tty5 Ss+ 0:00 /sbin/mingetty tty5

Примечания

Альтернативой ps является команда top, удобно выводящая на экран постоянно обновляющуюся информацию, однако top ограничена размерами окна, поэтому всё, что не может поместиться на экран, просто игнорируется.

Для команды ps удобно пользоваться конвейером и утилитой less для пролистывания выводимой информации с помощью кнопок вверх и вниз, например ps ax | less

С помощью утилиты grep удобно искать и выводить только нужные процессы, например ps ax | grep smbd

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

KILL

kill - терминирование процессов

СИНТАКСИС

kill [-номер_сигнала] идентификатор_процесса ...

ОПИСАНИЕ

По умолчанию команда kill посылает сигнал 15 (завершиться) процессу с указанным идентификатором. Таким способом обычно терминируют процесс, который не устанавливает нестандартную реакцию на сигналы. Идентификаторы_процессов можно узнать по команде ps(1) (в колонке PID). Идентификатор асинхронно запущенного процесса сообщается shell'ом в момент запуска (в случае конвейера сообщается только идентификатор последнего процесса).

Подробно о терминировании процесов см. kill(2). Например, если указан процесс с номером 0, то сигнал будет послан всем процессам данной группы.

ОПЦИИ

pid ...

Указать список идентификаторов процессов, которым команда kill должна послать сигнал. Каждый аргумент pid должен быть номером процесса либо его именем.

-s

Указать посылаемый сигнал. Сигнал должен быть указан по имени либо по номеру.

-p

Указывает, что команда kill должна вывести идентификаторы (pid) поименованных процессов, но не посылать им сигнал.

-l

Выводит список имен сигналов. Эти имена можно посмотреть также в файле /usr/include/linux/signal.h

Терминируемый процесс должен принадлежать текущему пользователю, если последний не является суперпользователем.

Если в качестве первого аргумента указан (с предшествующим знаком -) номер_сигнала, то вместо сигнала 15 посылается он [см. signal(2)]. Так, команда kill -9 ... уничтожает процесс наверняка, если, конечно, для уничтожения хватает прав.

Сигналы и контроль над процессами

Одной из задач опытных администраторов и пользователей является запуск, остановка и перезапуск сервисов, а также остановка сбойных и зависших процессов, причем с минимальным уроном. В различных операционных системах, а также в различных командных оболочках (шеллах) способы управления сигналами сильно рознятся. Поэтому в этой статье мы остановимся на ОС Linux и bash shell.

Сигналы нужны для того, чтобы взаимодействовать с процессами и демонами. Процессом называется любое активное действие. Демоны являются фоновыми (background) процессами, и до поры скрыты. Они ждут либо события, на которое они отреагируют, либо наступления времени, назначенного для выполнения некоего задания по расписанию. О наступлении этого события они узнают, получая сигнал от какого-то другого процесса. Каждая программа должна иметь в своем коде обработчик сигналов, чтобы отслеживать (перехватывать) сигналы и правильно реагировать на них. Страница руководства man signal описывает всевозможные сигналы и их действия. Сигналы посылают при помощи команды kill ("убить"). Команда kill -l выводит список сигналов и их номеров.

Все демоны и процессы имеют Идентификатор Процесса (PID). PID процесса можно узнать при помощи команды ps:

$ ps aux

USER PID %CPU %MEM TTY STAT COMMAND

root 1 0.0 0.1 ? S init '2'

105 7783 0.0 0.2 ? Ss /usr/bin/dbus-daemon --system

hal 7796 0.0 0.7 ? Ss /usr/sbin/hald

postfix 7957 0.0 0.2 ? S qmgr -l -t fifo -u -c

nagios 8371 0.0 0.2 ? SNs /usr/sbin/nagios /etc/nagios/nagios.cfg

В приведенном выше примере, вывод команды сильно сокращен - в вашей системе вы увидите куда больше строк и столбцов. Если какой-нибудь процесс "ворует" мощность вашего процессора или вашу память, вы увидите это в столбцах %CPU и %MEM.

Еще быстрее "зарвавшийся" процесс можно обнаружить при помощи команды top. В ней, по умолчанию, процессы, потребляющие больше ресурсов процессора, расположены в верхних строках таблицы. Мы можем немного поиграть с программой top при помощи команды yes:

$ yes carla is teh awesum

Эта команда станет повторять "carla is teh awesum" с большой скоростью, пока вы ее не остановите. Она загонит процент использования процессора в красную зону:

$ top

...

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

12144 carla 25 0 31592 17m 13m R 93.4 3.5 0:50.26 konsole

22236 carla 15 0 2860 468 400 S 4.3 0.1 0:00.97 yes

Интересно, что ответственность за разбазаривание мощности CPU ложится на консоль, а не на программу yes, так как yes работает внутри консоли. Если вы перейдете на "истинную" консоль (Ctrl+Alt+F2), то там увидите программу yes с большими цифрами потребления мощности процессора и использования памяти.

Существует несколько способов остановить yes. Если вы перейдете обратно в шелл, где она работает, просто нажмите Ctrl+C. Вы можете также остановить ее при помощи команды kill в другом шелле, как по PID, так и по имени:

$ kill 22236 $ killall yes

Ctrl+C посылает с клавиатуры сигнал SIGINT (2), или завершающее прерывание (terminate interrupt). kill и killall, оба, шлют по умолчанию SIGTERM (15). SIGTERM (15) может быть перехвачен и, либо игнорирован, либо интерпретирован иначе. Так что, в случае непредсказуемой работы, вы можете не добиться завершения процесса.

Применяя команду kill к родительскому процессу, вы, как правило (но не всегда), завершаете дочерний вместе с ним. Как узнать, какой процесс является дочерним? Используйте команду ps с опцией -f :

$ ps axf

22371 ? R 2:35 _ konsole 'kdeinit'

22372 pts/3 Ss 0:00 | _ /bin/bash

24322 pts/3 S+ 0:00 | | _ yes carla is teh awesum

22381 pts/4 Rs 0:00 | _ /bin/bash

24323 pts/4 R+ 0:00 | | _ ps axf

Вернемся к нашим SIGHUP'ам

SIGHUP произносится как "сиг-ап" и означает "сигнал отбоя" (signal hangup). Как послать SIGHUP? Существует несколько способов:

# kill -HUP 'pid'

# killall -HUP 'process-name'

# kill -1 'pid'

# killall -1 'process-name'

Как видите, можно использовать PID или имя процесса, а также имя или номер сигнала.

Зачем применять все эти команды, когда можно перезапустить процессы при помощи команды /etc/init.d/foo restart? Ведь предпочтительней контролировать сервисы с помощью их файлов init, так как такой контроль обычно включает санацию, проверку ошибок и другие функции. Если говорить честно, то главная причина использовать команду kill и сигналы состоит в том, чтобы остановить зависший или сбойный процесс как можно аккуратнее, и не прибегать к перезагрузке или завершению сеанса.

Применение команды kill к процессам

Как можно видеть в man signal, существуют десятки способов контролировать процессы. Вот наиболее часто применяемые:

kill -STOP 'pid' SIGSTOP (19) останавливает процесс, не "убивая" его.

kill -CONT 'pid' SIGCONT (18) перезапускает остановленный процесс.

kill -KILL 'pid' SIGKILL (9) форсирует немедленное завершение процесса, и не производит никакой чистки.

kill -9 -1 Завершает все ваши процессы (которыми вы владеете).

SIGKILL и SIGSTOP не могут быть перехвачены, блокированы или игнорированы; остальные могут. Это ваше "большое ружье", последнее средство обороны.

Команда kill, встроенная в Bash

Оболочка Bash имеет встроенную команду kill, как показано в следующем листинге:

$ type -all kill kill is a shell built-in kill is /bin/kill

Маловероятно, что у вас возникнут конфликты или странное поведение программ, но на всякий случай выбирайте /bin/kill.

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

Ресурсы