36024

Основные задачи системного администрирования. Процессы и их идентификаторы

Доклад

Информатика, кибернетика и программирование

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

Русский

2013-09-20

34.51 KB

0 чел.

Основные задачи системного администрирования. Процессы и их идентификаторы

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

Процесс - это загруженная в оперативную память программа. В Linux вначале запускается процесс, который загружает в оперативную память программу из указанного ему файла и начинает ее выполнять. Это означает, что каждый процесс должен быть запущен (как говорят - "порожден") каким-то другим процессом. То есть для каждого процесса однозначно определен его "родитель" (или "предок"), для которого данный процесс является "дочерним" (или "потомком"). Если вы хотите увидеть "дерево" запущенных в вашей системе процессов, выполните команду pstree. Вывод этой команды позволяет увидеть, что "отцом" всех процессов в системе (или "корнем дерева процессов") является процесс init, который первым запускается после загрузки ядра.

Каждый процесс в системе имеет уникальный идентификатор - PID, назначаемый процессу при запуске. Процесс с идентификатором 1 выполняет программу init. Каждый запущенный процесс в любой момент времени находится в одном из следующих состояний: активен (R), приостановлен (T) или "спит" (S). Текущее состояние процесса называют статусом процесса.

Если процесс-родитель по каким-то причинам не может принять сигнал о завершении дочернего процесса, то процесс-потомок превращается в "зомби" и получает статус Z. Процессы-зомби не занимают процессорного времени (т. е. их выполнение прекращается), но соответствующие им структуры ядра не освобождаются. Уничтожение таких процессов - одна из обязанностей системного администратора. Наконец, процесс может надолго "впасть в сон", прервать который не удается. Статус таких процессов обозначается символом D. Уничтожить их удается только при перезагрузке системы.

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

Процессы могут запускать ("внутри себя") отдельные нити (thread), или потоки. Нити - это параллельно выполняемые части одной программы, которые в Linux реализованы как процессы, запускаемые со специальным флагом. С точки зрения системы они отличаются от других процессов только тем, что для них не создается отдельное окружение, они выполняются в среде родительского процесса.

Процедура загрузки ОС Linux

Процесс init и файл /etc/inittab

После включения питания компьютера и завершения тестирования аппаратной части BIOS считывает из первого сектора загрузочного диска короткую программу-загрузчик. Эта программа запускает основной системный загрузчик (например, lilo ), который, в свою очередь, загружает в память ядро системы, которое обычно хранится в файле vmlinuz-x.y.z-a в каталоге /boot. Здесь x.y.z - это номер версии ядра, а вместо символа a часто стоит указание на какие-то конкретные модификации ядра. Впрочем, название файла ядра может быть и другим, для загрузчика это не имеет значения, только это имя надо указать в конфигурационном файле загрузчика.

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

Первым делом после старта процесс init считывает свой конфигурационный файл /etc/inittab. Этот файл состоит из отдельных строк. Если строка начинается со знака # или пуста, то она игнорируется. Все остальные строки состоят из 4 полей, разделенных двоеточиями:

id:runlevels:action:process

где:

  1. id - идентификатор строки. Это произвольная комбинация, содержащая от 1 до 4 символов. В файле inittab не может быть двух строк с одинаковыми идентификаторами;
  2. runlevels - уровни выполнения, на которых эта строка будет задействована. Уровни задаются цифрами или буквами без разделителей, например, 345;
  3. process - процесс, который должен запускаться на указанных уровнях. Другими словами в этом поле указывается имя программы, вызываемой при переходе на указанные уровни выполнения;
  4. action - действие.

Более подробно о файле inittab можно узнать из man-страниц init (8), inittab (5) и getty (8).

Далее init выполняет команды, указанные в строке с ключевым словом sysinit. В стандартной конфигурации здесь выполняется скрипт rc.sysinit из каталога /etc/rc.d. После этого процесс init просматривает файл /etc/inittab и выполняет скрипты, соответствующие однопользовательскому уровню, всем уровням и уровню, заданному по умолчанию. В строке, соответствующей уровню по умолчанию, вызывается скрипт rc из каталога /etc/rc.d.

Следующая важная функция, которую выполняет этот процесс - запуск шести виртуальных консолей (процессов getty ), чтобы предоставить пользователям возможность регистрироваться в системе с терминалов. Для этого init порождает процессы, именуемые getty -процессами (от "get tty" - получить терминал), и следит за тем, какой из процессов открывает какой терминал. Каждый getty -процесс устанавливает свою группу процессов, используя вызов системной функции setpgrp, открывает отдельную терминальную линию и обычно приостанавливается во время выполнения функции open до тех пор, пока машина не получит аппаратную связь с терминалом. Когда функция open возвращает управление, getty -процесс исполняет программу login (регистрации в системе), которая требует от пользователей, чтобы они идентифицировали себя указанием регистрационного имени и пароля. Если пользователь зарегистрировался успешно, программа login, наконец, запускает командный процессор shell и пользователь приступает к работе.

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

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

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

Когда суперпользователь останавливает систему (командой shutdown ), именно init завершает все другие исполняющиеся процессы, размонтирует все файловые системы и останавливает процессор.

Процессы, происходящие при регистрации пользователя

Последовательность событий при полной регистрации выглядит так.

  1.  Пользователь вводит регистрационное имя по приглашению login: процесса getty.
  2. getty выполняет программу login, используя в качестве аргумента указанное имя.
  3. login запрашивает пароль и сверяет имя и пароль с записанными в файле /etc/passwd.
  4. login выводит на экран из файла /etc/motd "сообщение дня".
  5. login запускает интерпретатор shell, указанный в бюджете пользователя и устанавливает переменную среды TERM.
  6. shell выполняет соответствующие файлы запуска, после чего выводит на экран приглашение и ожидает ввода информации.

В домашнем каталоге пользователя находятся несколько личных файлов конфигурации. Если таких файлов в домашнем каталоге нет, то после входа в систему будут прочитаны глобальные файлы, содержащие значения "по умолчанию". Если в качестве оболочки используется Bourne-shell, выполняется файл .profile, если C-shell - .login и .cshrc, если Korn-shell - .profile и .kshrc

/home/your_home/.bashrc - устанавливает ваши алиасы (т. е. псевдонимы или альтернативные имена команд, удобные для упрощения ввода часто используемых команд, имеющих значительную длину из-за большого количества опций) и функции;

/home/your_home/.bash_profile или /home/your_home/.profile - устанавливает переменные среды и запускает ваши программы.

Если такие файлы существуют (это скрытые файлы), они будут считаны после входа в систему, и команды, записанные в них, будут выполнены.

Если вы хотите, чтобы при входе пользователя в систему выполнялся какой-то скрипт, то можно вызов этого скрипта поместить в файл ~/.profile

Эти команды будут исполняться только при входе пользователя в систему. Можно, например, приветствовать каждого пользователя по имени или посылать индивидуальные сообщения:

if test $USER = jim; then

echo 'Здравствуйте, уважаемый Jim!'

fi

Редактирование файла /etc/fstab

Монтирование основных файловых систем осуществляется на этапе загрузки системы. Другие (дополнительные) файловые системы монтируются командой mount. Конфигурационным файлом для команды монтирования является файл /etc/fstab.

Одним из неудобств ОС Linux по сравнению с Windows является необходимость монтировать файловую систему при работе со сменными. Каждый раз при смене диска приходится заново монтировать и размонтировать файловую систему.

Чтобы не повторять одинаковых действий при каждом перезапуске системы и сократить число необходимых символов, которые приходится вводить с клавиатуры при выполнении операций монтирования, целесообразно выполнить следующее. Сначала создайте точки монтирования (пустые каталоги) для каждого из устройств или внешних файловых систем, которые вы будете периодически подключать: гибкого диска, CD-ROM, ZIP-диска, сетевых дисков, которые будут подключаться по NFS. Это можно сделать из Midnight Commander или следующими командами:

[root]# cd /mnt

[root]# mkdir floppy; mkdir cdrom; mkdir win; mkdir zip; mkdir server

Теперь отредактируйте файл /etc/fstab, добавив в него следующие строки, соответствующие тем устройствам, которые имеются в вашей системе (то, что в файле было до вас, лучше не трогать):

/dev/fd0 /mnt/floppy vfat user,noauto 0 1

/dev/cdrom /mnt/cdrom iso9660 ro,user,noauto 1

/dev/sda4 /mnt/zip vfat user,noauto,exec 0 1

/dev/hda1 /mnt/win vfat user,noauto 0 1

server:/export /mnt/server nfs defaults

Редактирование файла /etc/fstab можно выполнить и с помощью программы linuxconf (команда File systems | Access local drive ).

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

Первым делом научимся определять, какие процессы в системе запущены. Для этого в Linux имеется команда ps. Если ее запустить без всяких параметров, то она выдает список процессов, запущенных в текущей сессии. Если вы хотите увидеть список всех процессов, запущенных в системе, надо задать ту же команду с параметром -ax или -A. В первом случае выдается полная командная строка запуска программы, а во втором - только имя запущенной программы.

Для того чтобы увидеть все процессы в системе, используя стандартную форму вывода:

[user]$ ps -e

Можно к той же команде добавить опцию -o, после которой указать через запятую, какие именно поля вы хотите видеть в выводе команды:

[user]$ ps -eo pid,user,cmd

Для того, чтобы увидеть все процессы в системе, используя форму вывода BSD-систем:

[user]$ ps ax

Для того, чтобы увидеть все процессы в системе, с применением графического отображения отношения "предок-потомок":

[user]$ ps -ef

Впрочем, для того, чтобы увидеть "лес" деревьев "предок-потомок", лучше воспользоваться очень интересным аналогом команды ps -ef - командой pstree.

Для того, чтобы увидеть, сколько % ЦПУ и памяти занимают запущенные вами процессы:

[user]$ ps -u

Чтобы узнать приоритет процесса и значение nice, воспользуйтесь опцией -l:

[user]$ ps –l

В отличие от ps команда top отображает состояние процессов и их активность "в реальном режиме времени". Переключать режимы отображения можно с помощью команд, которые программа top воспринимает. Это следующие команды (просто нажимайте соответствующие клавиши, только с учетом регистра, то есть вместе с клавишей Shift ):

  1.  <Shift>+<N> - сортировка по PID;
  2.  <Shift>+<A> - сортировать процессы по возрасту;
  3.  <Shift>+<P> - сортировать процессы по использованию ЦПУ;
  4.  <Shift>+<M> - сортировать процессы по использованию памяти;
  5.  <Shift>+<T> - сортировка по времени выполнения.

Кроме команд, определяющих режим сортировки, команда top воспринимает еще ряд команд, которые позволяют управлять процессами в интерактивном режиме. С помощью команды <K> можно завершить некоторый процесс (его PID будет запрошен), а с помощью команды <R> можно переопределить значение nice для некоторого процесса. Таким образом, эти две команды аналогичны командам kill и renice.

Приоритеты, значение nice и команда renice

Приоритет для каждого процесса устанавливается в тот момент, когда процесс порождается. Приоритет процесса определяется "значением nice", которое лежит в пределах от +20 (наименьший приоритет, процесс выполняется только тогда, когда ничто другое не занимает процессор), до -19 (наивысший приоритет).

Значение nice устанавливается для каждого процесса в момент порождения этого процесса и при обычном запуске команд или программ принимается равным приоритету родительского процесса. Но существует специальная команда nice, которая позволяет изменять значение nice при запуске программы. Формат использования этой программы:

nice [- adnice] command [args]

где adnice - значение (от -20 до +19), добавляемое к значению nice процесса-родителя. Полученная сумма и будет значением nice для запускаемого процесса. Отрицательные значения может устанавливать только суперпользователь. Если опция - adnice не задана, то по умолчанию для процесса-потомка устанавливается значение nice, увеличенное на 10 по сравнению со значением nice родительского процесса.

Другая команда, renice, служит для изменения значения nice для уже выполняющихся процессов. Ее формат таков:

renice priority [[-p] PID] [[-g] grp] [[-u] user]

Например, команда

[root]# renice -1 987 -u daemon -p 32

увеличивает на 1 приоритет процессов с PID 987 и 32, а также всех процессов пользователя daemon.

Сигналы и команда kill

Сигналы - это средство, с помощью которого процессам можно передать сообщения о некоторых событиях в системе. Сами процессы тоже могут генерировать сигналы, с помощью которых они передают определенные сообщения ядру и другим процессам.

[user]$ kill -l

Сигналы принято обозначать номерами или символическими именами. Все имена начинаются на SIG, но эту приставку иногда опускают: например, сигнал с номером 1 обозначают или как SIGHUP, или просто как HUP.

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

Можно заставить процесс игнорировать или блокировать некоторые сигналы. Игнорируемый сигнал просто отбрасывается процессом и не оказывает на него никакого влияния. Блокированный сигнал ставится в очередь на выдачу, но ядро не требует от процесса никаких действий до разблокирования сигнала. После разблокирования сигнала программа его обработки вызывается только один раз, даже если в течение периода блокировки данный сигнал поступал несколько раз.

В табл. 8.1. приведены некоторые из часто встречающихся сигналов.

Таблица 8.1. Сигналы

Имя

Описание

Можно перехватывать

Можно блокировать

Комбинация клавиш

1

HUP

Hangup. Отбой

Да

Да

2

INT

Interrupt. В случае выполнения простых команд вызывает прекращение выполнения, в интерактивных программах - прекращение активного процесса

Да

Да

<Ctrl>+<C> или <Del>

3

QUIT

Как правило, сильнее сигнала Interrupt

Да

Да

<Ctrl>+<\>

4

ILL

Illegal Instruction. Центральный процессор столкнулся с незнакомой командой (в большинстве случаев это означает, что допущена программная ошибка). Сигнал отправляется программе, в которой возникла проблема

Да

Да

8

FPE

Floating Point Exception. Вычислительная ошибка, например, деление на ноль

Да

Да

9

KILL

Всегда прекращает выполнение процесса

Нет

Нет

11

SEGV

Segmentation Violation. Доступ к недозволенной области памяти

Да

Да

13

PIPE

Была предпринята попытка передачи данных с помощью конвейера или очереди FIFO, однако не существует процесса, способного принять эти данные

Да

Да

15

TERM

Software Termination. Требование закончить процесс (программное завершение)

Да

Да

17

CHLD

Изменение статуса порожденного процесса

Да

Да

18

CONT

Продолжение выполнения приостановленного процесса

Да

Да

19

STOP

Приостановка выполнения процесса

Нет

Нет

20

TSTR

Сигнал останова, генерируемый клавиатурой. Переводит процесс в фоновый режим

Да

Да

<Ctrl>+<Z>

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

Для посылки сигнала процессу (или группе процессов) можно воспользоваться командой kill в следующем формате:

[user]$ kill [-сигн] PID [PID..]

где сигн - это номер сигнала, причем если указание сигнала опущено, то посылается сигнал 15 ( TERM - программное завершение процесса). Чаще всего используется сигнал 9 ( KILL ), с помощью которого суперпользователь может завершить любой процесс. Но его использование может привести к нарушению порядка в системе. Поэтому в большинстве случаев рекомендуется использовать сигналы TERM или QUIT, которые завершают процесс более "мягко".

Наиболее часто команду kill вынужден применять суперпользователь. Он должен использовать ее для уничтожения процессов-зомби, зависших процессов (они показываются в листинге команды ps как <exiting>), процессов, которые занимают слишком много процессорного времени или слишком большой объем памяти и т. д. Особый случай - процессы, запущенные злоумышленником. Но обсуждение этого особого случая выходит за рамки данной книги.

Перевод процесса в фоновый режим

Если вы запускаете какой-то процесс путем запуска программы из командной строки, то обычно процесс "привязывается" к терминалу, с которого он запущен, воспринимая ввод с этого терминала и осуществляя на него вывод. Но можно запустить процесс в фоновом режиме, когда он не связан с терминалом. Для запуска процесса в фоновом режиме в конце командной строки запуска программы добавляют символ &.

В оболочке bash имеются две встроенные команды, которые служат для перевода процессов на передний план или возврата их в фоновый режим. Команда jobs вызывается без аргументов и показывает задания, запущенные из текущего экземпляра shell. В начале каждой строки вывода этой команды указывается порядковый номер задания в виде числа в квадратных скобках. После номера указывается состояние процесса: stopped (остановлен), running (выполняется) или suspended (приостановлен). В конце строки указывается команда, которая исполняется данным процессом. Один из номеров выполняющихся заданий помечен знаком +, а еще один - знаком -. Процесс, помеченный знаком +, будет по умолчанию считаться аргументом команд fg или bg, если они вызываются без параметров. Процесс, помеченный знаком -, получит знак +, если только завершится по какой-либо причине процесс, который был помечен знаком +.

Команды fg и bg служат для перевода процессов на передний план или возврата их в фоновый режим. В качестве аргумента обеим этим командам передаются номера тех заданий, которые присутствуют в выводе команды jobs. Если аргументы отсутствуют, то подразумевается задание, помеченное знаком +. Команда fg переводит указанный в аргументе процесс на передний план, а команда bg - переводит процесс в фоновый режим. Одной командой bg можно перевести в фоновый режим сразу несколько процессов, а вот возвращать их на передний план необходимо по одному.

Команда nohup

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

nohup команда &

Запускаемый таким образом процесс будет игнорировать посылаемые ему сигналы (если это возможно). Стандартный выходной поток и стандартный поток ошибок при таком запуске команд перенаправляются в файл nohup.out или $HOME/nohup.out.

Команда nohup имеет побочный эффект, заключающийся в том, что значение nice для запускаемого процесса увеличивается на 5, т. е. процесс выполняется с более низким приоритетом.

Управление пользователями

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

  1. /etc/issue - сообщение, выдаваемое системой до приглашения "login:";
  2. /etc/motd - сообщение, выдаваемое системой после входа пользователя в систему.

Но учтите, что скрипт /etc/rc.d/rc.local может перезаписывать файлы /etc/issue и /etc/motd при каждом перезапуске системы. То есть корректировать, возможно, надо не сами эти файлы, а скрипт /etc/rc.d/rc.local.


 

А также другие работы, которые могут Вас заинтересовать

68169. МУЗИЧНИЙ ВИМІР БУТТЯ ЛЮДИНИ ТА СОЦІАЛЬНОЇ РЕАЛЬНОСТІ 127.5 KB
  Але якщо раніше звучання музики було локалізоване в часі та просторі то у сучасному світі музику можна почути коли і де завгодно. У подібному процесі немає нічого дивного оскільки сама природа музики як мінімум подвійна. Двоїстість музики свідчить про подвійну природу самої людини а значить...
68172. УЯВЛЕННЯ ПРО БАГАТОВИМІРНЕ МИСЛЕННЯ, ЙОГО ПРИЙОМИ ТА ПРОЦЕДУРИ 327 KB
  Це мислення формується в рамках нової народжуваної холістичної раціональності усвідомлення якої багато в чому сполучене з переосмисленням уявлень про еволюцію у якій слід розрізняти еволюцію екстенсивну та інтенсивну. Інтенсивна еволюція у першу чергу вимагає глибокого переосмислення фундаментального...
68174. ГАРАНТІЇ ЗАБЕЗПЕЧЕННЯ ПРАВА ЛЮДИНИ НА ПОВАГУ ДО ЧЕСТІ І ГІДНОСТІ У КРИМІНАЛЬНОМУ СУДОЧИНСТВІ УКРАЇНИ 197.5 KB
  Разом із цим проголосивши ратифіковані міжнародні договори складовою частиною своєї правової системи Україна визнала й загальні принципи міжнародного права які також містять вимогу поваги до честі і гідності особи у тому числі й у сфері кримінального процесу.
68175. ПЛАНУВАННЯ СТРУКТУРИ КАПІТАЛУ ПРОМИСЛОВО-ФІНАНСОВИХ ГРУП 495 KB
  В Україні інтегровані об’єднання що діють за принципом промислово-фінансових груп ПФГ формують вагому базу національної економіки і є одними з лідерів в обраних галузях. Оптимізація структури капіталу ПФГ є одним із важливих чинників їхнього функціонування в умовах що склалися на ринках капіталу та інвестицій.
68176. ДИРЕКТИВИ В УСНОМУ МОВЛЕННІ ДІТЕЙ МОЛОДШОГО ШКІЛЬНОГО ВІКУ 239.5 KB
  Рульова своїми дослідженнями проведеними на матеріалі англійської французької російської а також частково української мови підготували ґрунт для комплексного вивчення мовлення дітей. Об’єктом переважної більшості онтолінгвістичних розвідок є мовлення дітей...
68177. ПСИХОДРАМА ЯК СЮЖЕТОТВОРЧИЙ КОМПОЗИЦІЙНИЙ ПРИНЦИП В РОМАНАХ МАРО ДУКА 186.5 KB
  Творчість Маро Дука яскраво репрезентує жіночу постмодерністську літературу сучасної Греції. Маро Дука нар. Після 1981 року Маро Дука присвятила себе письменницькій діяльності її твори відомі у Греції та в інших країнах свідченням чого є численні критичні статті присвячені її творчості...