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

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

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

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

fg % n, где n – порядковый номер выполняющегося задания (который выводится командой jobs), – переводит задание из фонового в приоритетный режим.

bg % n, где n – порядковый номер выполняющегося задания, – переводит задачу в фоновом режиме из соcтояния Stopped в состояние Running.

Нажатие клавиш <Ctrl>+<Z> – перерывает задачу и переводит ее в фоновый режим в состояние Stopped.

Команда ps – определяет, какие процессы в системе запущены.

ps [флаги]

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

- USER — имя владельца процесса;

- PID — идентификатор процесса в системе;

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

- %CPU — доля времени центрального процессора (в процентах), выделенного данному процессу;

- %MEM — доля реальной памяти (в процентах), используемая данным процессом;

- VSZ — виртуальный размер процесса (в килобайтах);

- RSS — размер резидентного набора (количество 1K-страниц в памяти);

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

- TTY — указание на терминал, с которого запущен процесс;

- S или STAT — статус процесса;

- PRI — приоритет планирования;

- NI — относительный приоритет – значение nice (учитывается при создании очереди на выполнение планировщиком);

- TIME — сколько времени центрального процессора занял данный процесс;

- CMD или COMMAND — командная строка запуска программы, выполняемой данным процессом;

а также и другие поля, полный список которых приведен на man-странице, посвященной команде ps.

В поле "Статус процесса", как уже говорилось выше, могут стоять следующие значения:

- R — выполнимый процесс, ожидающий только момента, когда планировщик задач выделит ему очередной квант времени;

- S — процесс "спит";

- D — процесс находится в состоянии подкачки на диске;

- T — остановленный процесс;

- Z — процесс-зомби.

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

- W — процесс не имеет резидентных страниц;

- < — высоко-приоритетеный процесс;

- N — низко-приоритетный процесс;

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

Чтобы получить список всех процессов, надо использовать команду ps с флагами ax (без дефиса!) или –A. Вывод в этих двух случаях отличается только в поле CMD: в первом случае выдается полная командная строка запуска программы, а во втором — только имя запущенной программы.

Некоторые флаги команды ps:

Выбирает все процессы
-N Отрицание выбора
Выбирает все процессы, связанные с конкретным терминалом, кроме главных системных процессов сеанса
-d Выбирает все процессы, кроме главных системных процессов сеанса
Выбирает все процессы
а Выбирает все процессы, связанные с данным терминалом, в том числе и других пользователей
r Выводит информацию лишь о работающих процессах
х Выбирает все процессы, отсоединенные от терминала
Вывод в формате, заданном пользователем
-f Для вывода использует графическое представление дерева процессов
-u Выбирает процессы по действующему идентификатору пользователя
Выбирает процессы по имени команды
-G Выбирает процессы по GID
-U Выбирает процессы по UID
-p Выбирает процессы по идентификаторам процессов
-t Выбирает все процессы на конкретном терминале
--no-headers Не включать в вывод заголовки столбцов

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

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

ps –e

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

ps –eo pid,user,cmd

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

ps ax

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

ps –ef

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

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

ps –u

Команда top – позволяет сделать как бы "моментальный снимок" процессов, запущенных в системе. В отличие от ps команда top отображает состояние процессов и их активность "в реальном режиме времени". На рисунке изображено окно терминала, в котором запущена программа top.

Как видите, в верхней части окна отображается астрономическое время, время, прошедшее с момента запуска системы, число пользователей в системе, число запущенных процессов и число процессов, находящихся в разных состояниях, данные об использовании ЦПУ, памяти и свопа. А далее идет таблица, характеризующая отдельные процессы. Число строк, отображаемых в этой таблице, определяется размером окна: сколько строк помещается, столько и выводится. Графы таблицы обозначены так же, как поля вывода команды ps, так что дополнительных пояснений здесь не требуется.

Содержимое окна обновляется каждые 5 секунд. Список процессов может быть отсортирован по используемому времени ЦПУ (по умолчанию), по использованию памяти, по PID, по времени исполнения. Переключать режимы отображения можно с помощью команд, которые программа top воспринимает. Это следующие команды (просто нажимайте соответствующие клавиши, только с учетом регистра, то есть вместе с клавишей Shift):

- <Shift>+<N> — сортировка по PID;

- <Shift>+<A> — сортировать процессы по возрасту;

- <Shift>+<P> — сортировать процессы по использованию ЦПУ;

- <Shift>+<M> — сортировать процессы по использованию памяти;

- <Shift>+<T> — сортировка по времени выполнения.

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

Команда kill

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

kill –l

Если после флага –l указать номер сигнала, то будет выдано его символическое имя, а если указать имя, то получим соответствующий номер.

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

Имя Описание Комбинация клавиш
  HUP Hangup. Отбой  
  INT Interrupt. В случае выполнения простых команд вызывает прекращение выполнения, в интерактивных программах — прекращение активного процесса <Ctrl>+<C> или <Del>
  QUIT Как правило, сильнее сигнала Interrupt <Ctrl>+<\>
  ILL Illegal Instruction. Центральный процессор столкнулся с незнакомой командой (в большинстве случаев это означает, что допущена программная ошибка). Сигнал отправляется программе, в которой возникла проблема  
  FPE Floating Point Exception. Вычислительная ошибка, например, деление на ноль  
  KILL Всегда прекращает выполнение процесса  
  SEGV Segmentation Violation. Доступ к недозволенной области памяти  
  PIPE Была предпринята попытка передачи данных с помощью конвейера или очереди FIFO, однако не существует процесса, способного принять эти данные  
  TERM Software Termination. Требование закончить процесс (программное завершение)  
  CHLD Изменение статуса порожденного процесса  
  CONT Продолжение выполнения приостановленного процесса  
  STOP Приостановка выполнения процесса  
  TSTR Сигнал останова, генерируемый клавиатурой. Переводит процесс в фоновый режим <Ctrl>+<Z>

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

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

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

где сигн — это номер сигнала, причем если указание сигнала опущено, то посылается сигнал 15 (TERM — программное завершение процесса). Вместо PID процесса может быть использован порядковый номер выполняющегося задания, который выводится командой jobs, то есть команда kill [-сигн] % n, где n – порядковый номер выполняющегося задания, отменяет задание, выполняемое в фоновом режиме.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: