Резюме (Chapter Review)¶
В этой главе вы изучили управление процессами Linux. Мы начали с повторения понятия «процесс». Было установлено, что при запуске команды из командной строки или загрузке демона в системе создаётся процесс: код соответствующей программы загружается в оперативную память и выполняется процессором.
Было отмечено, что Linux является многозадачной операционной системой. Несмотря на то что процессор может выполнять только один процесс одновременно, Linux непрерывно распределяет процессорное время между множеством процессов, загруженных в память, создавая иллюзию их одновременного выполнения.
Также было указано, что при загрузке демона создаётся системный процесс, а когда конечный пользователь вводит команду в командной строке — пользовательский. Пользовательские процессы связаны с сеансом оболочки; системные — нет.
Затем мы рассмотрели наследование процессов Linux. Linux-процессы могут порождать другие процессы. Процесс, породивший другой, называется родительским (parent), а созданный в результате — дочерним (child). У каждого процесса Linux есть родительский процесс. Все процессы Linux восходят к процессу init или systemd (в зависимости от дистрибутива) — первому процессу, загружаемому ядром при запуске системы.
Каждому процессу Linux присваивается идентификатор процесса (PID), однозначно идентифицирующий его в системе. Процессам также присваивается PPID — PID родительского процесса. При запуске команды из командной строки создаётся новая оболочка (называемая субоболочкой), внутри которой выполняется команда. По завершении процесса субоболочка уничтожается, и управление возвращается исходной оболочке.
Далее мы перешли к управлению процессами. Сначала обсудили создание процессов: пользовательские создаются путём ввода команд в командной строке; системные — в дистрибутивах на init — запуском сценариев демонов из каталога init. Некоторые дистрибутивы используют сценарии System V init, хранящиеся в /etc/rc.d/init.d, другие — BSD init-сценарии из /etc/init.d. Дистрибутивы с systemd управляют службами командой systemctl.
Затем мы рассмотрели просмотр выполняющихся процессов. Первым была утилита top: она запускается командой top в командной строке. Нажав клавишу h при работающем top, можно открыть экран справки с информацией о сортировке по столбцам и добавлении дополнительных столбцов данных.
Для просмотра процессов также используется команда ps. По умолчанию она отображает только процессы текущего сеанса. Для вывода всех процессов применяется параметр –e; параметры –f и –l позволяют получить расширенную информацию. Кроме того, рассматривалась команда pgrep для поиска процессов по заданным критериям.
Далее мы обсудили назначение приоритетов. Приоритет процесса в значительной мере определяется его значением nice (nice value). Диапазон значений — от –20 до +19. Чем меньше значение, тем выше приоритет. Для установки значения nice при запуске используется команда nice (синтаксис: nice –n значение команда). Значение ниже 0 может задать только пользователь root. Для изменения nice-значения уже выполняющегося процесса без его выгрузки используется команда renice (синтаксис: renice значение PID).
Затем мы рассмотрели управление процессами на переднем и фоновом планах. По умолчанию процессы, запущенные из командной строки, работают на переднем плане и блокируют приглашение до своего завершения. Процесс можно запустить в фоновом режиме, добавив символ & в конец команды — тогда управление сразу вернётся в командную строку. Фоновому процессу присваивается идентификатор задания. Перевести фоновый процесс на передний план можно командой fg идентификатор_задания, а передний — в фоновый — нажатием CTRL-Z (для остановки), после чего командой bg идентификатор_задания.
Наконец, обсуждалось завершение выполняющихся процессов. Для этого используются команды kill и killall. Обе принимают различные сигналы завершения. Наиболее полезные из них:
SIGHUP(1)SIGINT(2)SIGKILL(9)SIGTERM(15)
Синтаксис kill: kill –сигнал PID. Синтаксис killall: killall –сигнал имя_процесса. При работе с зависшим процессом следует сначала пробовать менее агрессивные сигналы — SIGINT и SIGTERM — прежде чем прибегать к SIGKILL. Команда pkill позволяет искать и завершать процессы по критериям поиска. Запуск программы через nohup заставляет процесс игнорировать сигнал SIGHUP, посылаемый при выходе пользователя из системы. Команда screen позволяет создавать окна, которые можно отсоединить, обеспечивая продолжение работы процессов после выхода из системы.
В заключительной части главы мы рассмотрели планирование автоматического запуска процессов. Для однократного запуска в будущем используется демон at. Предварительно нужно убедиться, что демон atd запущен (командой rcatd start или systemctl start atd). Затем вводится at время. Значение может быть фиксированным (10:00) или относительным (tomorrow). Появляется приглашение at>, где вводятся команды; по завершении нажимается CTRL-D. Список заданий просматривается командой atq; удалить задание — atrm.
Для выполнения процессов по повторяющемуся расписанию используется демон cron. Он может выполнять как системные, так и пользовательские задания. Системные задания создаются путём добавления файлов сценариев в:
/etc/cron.hourly/etc/cron.daily/etc/cron.weekly/etc/cron.monthly
Также можно создать файл crontab в каталоге /etc/cron.d. Файл содержит одну строку для каждой команды; каждая строка — шесть полей:
- 1 — минуты;
- 2 — час;
- 3 — день;
- 4 — месяц;
- 5 — день недели;
- 6 — команда.
Пользовательские задания cron хранятся в /var/spool/cron/tabs. Файл crontab создаётся командой crontab –e, просматривается — crontab –l, удаляется — crontab –r.
Совместно с cron можно использовать anacron для запуска пропущенных (из-за выключения системы) заданий при следующем старте.
Ускоренный обзор (Accelerated Review)¶
- При запуске команды из командной строки в системе создаётся процесс.
- При загрузке процесса код программы загружается в оперативную память и выполняется процессором.
- Linux — многозадачная операционная система.
- Большинство процессоров могут выполнять только один процесс одновременно.
- Linux непрерывно распределяет процессорное время между множеством загруженных процессов, создавая иллюзию их одновременного выполнения.
- При загрузке демона процессом
initилиsystemdсоздаётся системный процесс. - При вводе команды конечным пользователем создаётся пользовательский процесс.
- Пользовательские процессы связаны с сеансом оболочки; системные — нет.
- Linux-процессы могут порождать другие Linux-процессы.
- Процесс, породивший другой, называется родительским.
- Созданный в результате процесс называется дочерним.
- У каждого Linux-процесса есть родительский.
- Все Linux-процессы восходят к
initилиsystemd— первому процессу, загружаемому ядром. - Каждому Linux-процессу присваивается PID, однозначно идентифицирующий его.
- Процессам присваивается PPID — PID родительского процесса.
- При запуске команды создаётся субоболочка, внутри которой она выполняется.
- По завершении процесса субоболочка уничтожается, управление возвращается исходной оболочке.
- Пользовательские процессы создаются при вводе команд в командной строке.
- Некоторые дистрибутивы используют System V init-сценарии из
/etc/rc.d/init.d. - Некоторые дистрибутивы используют BSD init-сценарии из
/etc/init.d. - В дистрибутивах с
systemdдля управления службами используетсяsystemctl. - Утилита
topзапускается командойtop; клавишаhоткрывает справку. - Для просмотра процессов используется
ps. - По умолчанию
psотображает только процессы текущего сеанса. ps –eвыводит все выполняющиеся процессы.ps –fиps –lотображают расширенную информацию.pgrepпозволяет искать конкретные процессы.- Linux позволяет устанавливать приоритеты процессов.
- Приоритет процесса определяется значением nice.
- Диапазон значений nice — от –20 до +19.
- Чем меньше значение nice, тем выше приоритет.
niceиспользуется для установки значения nice при загрузке процесса.- Синтаксис:
nice –n значение команда. - Значение nice ниже 0 может задать только root.
reniceизменяет значение nice выполняющегося процесса.- Синтаксис
renice:renice значение PID. - По умолчанию процессы выполняются на переднем плане.
- Процессы переднего плана блокируют командную строку до завершения.
- Процессы можно запускать в фоновом режиме.
- Фоновые процессы возвращают управление командной строке.
- Для запуска в фоновом режиме добавьте
&в конец команды. - Фоновому процессу присваивается идентификатор задания.
fg идентификатор_заданияпереводит процесс на передний план.- CTRL-Z останавливает передний процесс;
bg идентификатор_заданияпереводит его в фоновый. killиkillallиспользуются для завершения процессов.- Наиболее полезные сигналы:
SIGHUP(1),SIGINT(2),SIGKILL(9),SIGTERM(15). - Синтаксис:
kill –сигнал PID;killall –сигнал имя_процесса. - Перед
SIGKILLследует попробоватьSIGINTиSIGTERM. pkillпозволяет искать и завершать процессы по критериям.nohupпозволяет процессу игнорироватьSIGHUPи продолжать работу после выхода пользователя.screenсоздаёт отсоединяемые окна, позволяя процессам работать после выхода.- Для однократного запуска в будущем — демон
at. - Перед
atнеобходимо запуститьatd. - Запустить
atd:rcatd startилиsystemctl start atd. - Синтаксис:
at время; фиксированные значения:HH:MM,Noon,Midnight,Teatime,MMDDYY/MM/DD/YY/MM.DD.YY. - Относительные значения:
now,now +x minutes/hours/days,today,tomorrow. - В приглашении
at>вводятся команды; CTRL-D — завершение. - Если вывод не перенаправлен, он будет отправлен по электронной почте.
atq— просмотр заданий;atrm— удаление.- Для повторяющегося расписания —
cron. - Системные задания: в
/etc/cron.hourly,/etc/cron.daily,/etc/cron.weekly,/etc/cron.monthlyили в файле crontab в/etc/cron.d. - Поля crontab: 1 — минуты, 2 — час, 3 — день, 4 — месяц, 5 — день недели, 6 — команда.
- Пользовательские задания в
/var/spool/cron/tabs; создаютсяcrontab –e. crontab –l— просмотр;crontab –r— удаление.anacron— для выполнения пропущенных заданий при следующем старте.