Что такое процесс в linux
Перейти к содержимому

Что такое процесс в linux

  • автор:

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

Программы — это наборы инструкций, которые выполняет компьютер. Когда мы запускаем программу, инструкции копируются в память компьютера.

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

Запущенный экземпляр программы называется процессом. Процессами можно управлять.

Как узнать, какие процессы запущены сейчас

Linux, как и большинство современных ОС, — мультизадачен. Это значит, что в Linux одновременно может работать множество процессов.

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

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

Давайте подробнее разберемся, что здесь происходит:

  • Строка 2. Задачи (tasks) — это второе название процессов. В любой момент времени в вашей системе выполняется сразу несколько процессов. Большая часть из них системные. Многие — спят, и это нормально. «Спящие» процессы ожидают какого-то события, чтобы перейти в активное состояние.
  • Строка 3. Это анализ оперативной памяти. Не переживайте, если используется огромное количество памяти: Linux сохраняет недавно открытые программы для повышения быстродействия. Если какому-то процессу понадобится эта память — она очистится.
  • Строка 4. Это анализ виртуальной памяти системы. Если используется большое количество памяти — пора задуматься о ее увеличении. При наличии современного компьютера с достаточным количеством памяти такой проблемы у вас не возникнет.
  • Строки 6-10. Список наиболее ресурсоемких процессов системы в порядке убывания. Он обновляется в реальном времени — наблюдать за этим одно удовольствие. У вас перед глазами все, что происходит в вашей системе. Два важных столбца — используемая память и процент использования ЦП. Если какой-то из них находится на высоком уровне продолжительное время, стоит узнать, почему так. В столбце USER указывается пользователь, который запустил данный процесс, а PID это столбец, в котором указаны ID процессов — их уникальные идентификаторы.

Команда top предоставляет информацию о системе в реальном времени и показывает лишь то число процессов, которые умещаются на экране.

Есть другая команда — ps (processes, процессы). Обычно ее используют для того, чтобы увидеть список процессов в текущем терминале. Но если добавить аргумент aux , выведется полный список процессов, что гораздо полезнее.

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

Как удалить из памяти процессы, потерпевшие сбой

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

Это не страшно: процесс условного Firefox можно завершить и запустить браузер снова. Но сначала нам нужно узнать ID процесса браузера — PID (proccess ID, идентификатор процесса). Вот, как это будет выглядеть:

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

Обычно простой запуск kill завершает зависший процесс. В этом случае команда отправляет параметр по умолчанию — -1 . Этот сигнал указывает процессу, ему надо закрыться. Сначала всегда нужно попытаться воспользоваться этим вариантом: он короче.

Однако это не всегда работает. В примере выше мы запускали ps, но процесс все еще работал. Ничего страшного, значит, мы просто подадим параметр -9 — это сигнал для принудительного завершения процесса.

Примечание. Пользователь без root-прав может завершать лишь те процессы, которые он запустил. Root-пользователь может завершить любой.

Что делать, если завис рабочий стол

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

В Linux работает сразу несколько виртуальных консолей. Большую часть времени мы видим консоль номер 7 — с GUI. Но мы можем легко обратиться к другим.

Если GUI завис, можно закрыть проблемные процессы с другой консоли. Для переключения между консолями используйте последовательность Ctrl + Alt + F<Консоль>. Например, после нажатия Ctrl + Alt + F2 вы подключитесь к консоли, с помощью которой сможете получить id приведших к сбою процессов и отключить их. А Ctrl + Alt + F7 вернет вас в GUI, чтобы проверить, все ли в порядке.

Общая тактика такая: отключать процессы до тех пор, пока рабочий стол не «отвиснет».

Совет. Ищите процессы, которые потребляют много памяти и активно используют ЦП: обычно дело именно в них. Если это не помогает, проще перезагрузить компьютер.

Фоновые процессы и процессы переднего плана

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

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

В качестве примера приведем команду sleep . Эта команда ждет, когда пройдет заданное количество времени и завершает свою работу.

Для отображения работающих в фоне процессов можно использовать команду jobs .

Если вы запустите эту программу, то заметите, что терминал ждет 5 секунд и только потом предлагает ввод снова. Но если мы сделаем то же самое, но добавим в конец & (амперсанд), мы сообщим терминалу, что программу нужно запустить на фоне.

В этот раз процессу присваивается номер (и он, конечно же, выводится), и приглашение к вводу появляется сразу. Мы можем продолжать работать, пока выполняется фоновый процесс. Если по прошествии 5 секунд вы нажмете Enter, вы увидите сообщение, в котором говорится о том, что задание завершено.

Мы также имеем возможность перемещать процессы между фоном и передним планом. Делается это с помощью комбинации Ctrl + Z. После нажатия этой последовательности текущий фоновый процесс останавливается и перемещается на передний план.

Также мы можем использовать команду fg (foreground, передний план). С ее помощью мы можем перевести фоновый процесс на передний план.

<job number> — номер процесса.

Совет. В Windows Ctrl + Z служит для отмены. Часто пользователи, которые перешли на Linux с Windows, используют эту комбинацию и удивляются — куда же пропала программа и почему ввод появился снова. Если вы допустили эту ошибку, не переживайте. Используйте jobs , чтобы узнать номер задачи, который был назначен программе, и верните ее на передний план с помощью fg .

Что нужно запомнить

Команды

top
Выводит данные о процессах, запущенных в системе, в реальном времени.

ps
Выводит список процессов, запущенных в системе.

kill
Завершает процесс

jobs
Выводит список текущих фоновых процессов.

fg
Переводит фоновый процесс на передний план.

Ctrl + Z
Остановить текущий процесс переднего плана и перевести его в фон.

Практически задания

1. Запустите несколько программ на рабочем столе. Затем с помощью команды ps определите их PID и завершите их.
2. Попробуйте сделать то же самое, но сначала переключитесь на другую виртуальную консоль.
3. Поиграйтесь с командой sleep и перемещением процессов между передним и фоновым планами.

Процессы в Linux, взаимодействие процессов

Работа процессов linux, взаимодйствие процессов, управление процессами в linuxДоброго времени, гости моего блога! В сегодняшнем посте расскажу о том, как работают процессы в ОC Linux, а так же как управлять этими самыми процессами, о выполнении процессов в фоне, о повышении/понижении приоритета процессов.

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

В многозадачной системе может быть запущено множество программ. Каждая программа может запустить множество процессов (читай: подпрограмм). При этом в единственный момент на машине, выполняется только 1 процесс. То есть в единственный момент времени ресурсы железа (процессорное время, память, порт ввода/вывода) может использоваться только единственным процессом. Очередью, в которой процессу выделяется определенный ресурс железа, управляет планировщик. При этом, во время прерывания одного процесса и запуска (возобновления) другого процесса, состояние процесса (выполняемые действия, на каком этапе процесс приостановлен) запоминается и записывается в область памяти. Планировщик в Linux — это часть ядра, отвечающая за указанную функциональность. В задачи планировщика так же входит отслеживание и выделение запускаемым процессам определенного приоритета, чтобы процессы «не мешали» друг-другу работать, а так же распределение пространства памяти, чтобы пространство памяти одного процесса не пересекалось с пространством другого.

Все новые процессы в Linux порождаются клонированием какого-то уже имеющегося процесса, с помощью вызова системных функций clone(2) и fork(2) (от forking — порождение). У нового (порожденного или дочернего) процесса тоже окружение, что и у родителя, отличается только номер ID процесса (т.н. PID). Жизнь типичного процесса в Linux можно представить следующей схемой:

На которой можно описать пошагово следующие этапы:

  • процесс /bin/bash клонирует себя системным вызовом fork()
  • при этом создается клон /bin/bash с новым PID (идентификатор процесса) и PPID — равный PID родителя
  • Клон выполняет системный вызов exec с указанием на исполняемый файл и заменяет свой код — кодом исполняемого файла (родительский процесс при этом ждет завершения потомка — wait)
    • при этом, если по каком-то причинам, потомок завершил свою работу, а родительский процесс не смог получить об этом сигнал, то данный процесс (потомок) не освобождает занятые структуры ядра и состояние процесса становиться — zombie. О состояниях процесса ниже.

    Очень наглядную схему предоставила википедия:

    Состояния процессов Linux

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

    Первый процесс в системе запускается при инициализации ядра. Данный процесс называется — init и имеет PID=1. Это прородитель всех процессов в системе. Подробнее о процессе загрузки ядра и рождении процесса init можно почитать тут.

    В каких же состояниях может находиться процесс в Linux?

    Каждый запущенный процесс в любой момент времени находится в одном из следующих состояний (которое называют еще статусом процесса):

    • Активен (R=Running) – процесс находится в очереди на выполнение, то есть либо выполняется в данный момент, либо ожидает выделения ему очередного кванта времени центрального процессора.
    • «Спит» (S=Sleeping) – процесс находится в состоянии прерываемого ожидания, то есть ожидает какого-то события, сигнала или освобождения нужного ресурса.
    • Находится в состоянии непрерываемого ожидания (D=Direct) – процесс ожидает определенного («прямого») сигнала от аппаратной части и не реагирует на другие сигналы;
    • Приостановлен (T) – процесс находится в режиме трассировки (обычно такое состояние возникает при отладке программ).
    • «Зомби» (Z=Zombie) – это процесс, выполнение которого завершилось, но относящиеся к нему структуры ядра по каким-то причинам не освобождены. Одной из причин их появления в системе может быть следующая ситуация. Обычно освобождение структур ядра, относящихся к процессу, выполняет процесс-родитель после получения от потомка сигнала о завершении. Но бывают случаи, когда родительский процесс завершается раньше дочернего. Процессы, не имеющие родителя, называются «сиротами«. «Сироты» автоматически усыновляются процессом init, который и принимает сигналы об их завершении. Если процесс-родитель или init по каким-то причинам не может принять сигнал о завершении дочернего процесса, то процесс-потомок превращается в «зомби» и получает статус Z. Процессы-зомби не занимают процессорного времени (т. е. их выполнение прекращается), но соответствующие им структуры ядра не освобождаются. В некотором смысле это «мертвые» процессы. Уничтожение таких процессов — одна из обязанностей системного администратора. Хочу отметить, что появление данных процессов говорит о том, что в системе что-то не в порядке, и скорее всего не в порядке с аппаратной частью, так что берем memtest и MHDD и тестим-тестим. Не исключен вариант и кривого кода программы.

    Так же, говоря о процессах в линуксе, можно выделить особый вид процессов — демоны. Данный вид процессов работает в фоне (подобно службам в Windows), без терминала и выполняет задачи для других процессов. Данный вид процессов на серверных системах является основным.

    Т.к. в большинстве случаев, демоны в Linux простаивают и ожидают поступления каких-либо данных, соответственно, нужны относительно редко, так что держать их в памяти постоянно загруженными и расходовать на это ресурсы системы нерационально. Для организации работы демонов придуман демон inetd или его более защищенная модификация xinetd (eXtended InterNET Daemon или расширенный Интернет демон). В функции inetd (Xinetd) можно выделить:

    • установить ограничение на количество запускаемых серверов ( служб , демонов)
    • наблюдение за соединениями на определенных портах и обработка входящих запросов
    • ограничение доступа к сервисам на основе ACL (списков контроля доступа)

    Все процессы в системе, не важно Linux это или другая ОС, обмениваются между собой какой-либо информацией. Отсюда можно задать вопрос, а как же происходит межПРОЦЕССный обмен?

    В ОС LINUX существует несколько видов можпроцессного обмена, а точнее сказать средств межпроцессного взаимодействия (Interprocess Communication — IPC), которые можно разбить на несколько уровней:

    локальный (привязаны к процессору и возможны только в пределах компьютера);

    — каналы

    1. pipe (они же конвейеры, так же неименованные каналы), о них я много рассказывал в прошлом посте, примером можно привести: команда1 | команда2. По сути, pipe использует stdin, stdout и stderr.
    2. Именованные каналы (FIFO: First In First Out). Данный вид канала создаётся с помощью mknod или mkfifo, и два различных процесса могут обратиться к нему по имени. Пример работы с fifo:

    в первом терминале (создаем именованный канал в виде файла pipe и из канала направляем данные с помощью конвейера в архиватор):

    во втором терминале (отправляем в именованный канал данные):

    в результате это приведет к сжатию передаваемых данных gzip-ом

    — сигналы

    • с терминала, нажатием специальных клавиш или комбинаций (например, нажатие Ctrl-C генерирует SIGINT, а Ctrl-Z SIGTSTP);
    • ядром системы:
      • при возникновении аппаратных исключений (недопустимых инструкций, нарушениях при обращении в память, системных сбоях и т. п.);
      • ошибочных системных вызовах;
      • для информирования о событиях ввода-вывода;
      • из шелла, утилитой /bin/kill.

      сигнал — это асинхронное уведомление процесса о каком-либо событии. Когда сигнал послан процессу, операционная система прерывает выполнение процесса. Если процесс установил собственный обработчик сигнала, операционная система запускает этот обработчик, передав ему информацию о сигнале. Если процесс не установил обработчик, то выполняется обработчик по умолчанию.
      Все сигналы начинаются на «SIG…» и имеют числовые соответствия, определяемые в заголовочном файле signal.h. Числовые значения сигналов могут меняться от системы к системе, хотя основная их часть имеет в разных системах одни и те же значения. Утилита kill позволяет задавать сигнал как числом, так и символьным обозначением.
      Сигналы можно послать следующими способами:

      — разделяемая память

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

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

      — очереди сообщений

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

      удаленный;

      — удаленные вызовы процедур (Remote Procedure Calls — RPC)

      RPC — разновидность технологий, которая позволяет компьютерным программам вызывать функции или процедуры в другом адресном пространстве (как правило, на удалённых компьютерах). Обычно, реализация RPC технологии включает в себя два компонента: сетевой протокол (чаще TCP и UDP, реже HTTP) для обмена в режиме клиент-сервер и язык сериализации объектов (или структур, для необъектных RPC).

      — сокеты Unix

      Сокеты UNIX бывают 2х типов: локальные и сетевые. При использовании локального сокета, ему присваивается UNIX-адрес и просто будет создан специальный файл (файл сокета) по заданному пути, через который смогут сообщаться любые локальные процессы путём простого чтения/записи из него. Сокеты представляют собой виртуальный объект, который существует, пока на него ссылается хотя бы один из процессов. При использовании сетевого сокета, создается абстрактный объект привязанный к слушающему порту операционной системы и сетевому интерфейсу, ему присваивается INET-адрес, который имеет адрес интерфейса и слушающего порта.

      высокоуровневый

      1. Обычно — пакеты программного обеспечения, которые реализуют промежуточный слой между системной платформой и приложением. Эти пакеты предназначены для переноса уже испытанных протоколов коммуникации приложения на более новую архитектуру. Примером можно привести: DIPC, MPI и др. (мне не знакомы, честно говоря)

      Итак. Подведем маленький итог:

      • В Linux есть процессы,
      • каждый процесс может запускать подпроцессы (нити),
      • создание нового процесса создается клонированием исходного,
      • прородителем всех процессов в системе является процесс init, запускаемый ядром системы при загрузке.
      • процессы взаимодействуют между собой по средствам можпроцессного взаимодействия:
        • каналы
        • сигналы
        • сокеты
        • разделяемая память
        • PID — идентификатор процесса
        • PPID — идентификатор процесса, породившего данный
        • UID и GID — идентификаторы прав процесса (соответствует UID и GID пользователя, от которого запущен процесс)
        • приоритет процесса
        • состояние процесса (выполнение, сон и т.п.)
        • так же у процесса есть таблица открытых (используемых) файлов

        Далее поговорим о том, как посмотреть состояние процессов в Linux и о том, как же ими управлять.

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

        Получение информации о процессе

        Перед тем как управлять процессами, нужно научиться получать о процессах необходимую информацию. В Linux существует псевдофайловая система procfs, которая в большинстве дистрибутивов монтируется в общую ФС в каталог /proc. У данной файловой системы нет физического места размещения, нет блочного устройства, такое как жесткий диск. Вся информация, хранимая в данном каталоге находится в оперативной памяти компьютера, контролируется ядром ОС и она не предназначена для хранения файлов пользователя. О структуре данного каталога я написал в статье о файловой системе Linux. В этой файловой системе дано достаточно много информации, чтобы узнать о процессах и о системе в целом.

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

        Чтобы получить список всех процессов, достаточно ввести команду:

        # ps aux

        Прокомментируем некоторые интересные моменты. Можно заметить, что некоторые процессы указаны в квадратных скобках [ ] – это процессы, которые входят непосредственно в состав ядра и выполняют важные системные задачи, например, такие как управление буферным кэшем [pdflush] и организацией свопинга [kswapd]. С ними лучше не экспериментировать – ничего хорошего из этого не выйдет :). Остальная часть процессов относится к пользовательским.

        Какую информацию можно получить по каждому процессу (комментарии к некоторым полям):

        • PID, PPID – идентификатор процесса и его родителя.
        • %CPU – доля процессорного времени, выделенная процессу.
        • %MEM – процент используемой оперативной памяти.
        • VSZ – виртуальный размер процесса.
        • TTY – управляющий терминал.
        • STAT– статус процесса:
          • R – выполняется;
          • S – спит;
          • Z – зомби;
          • < – Повышенный приоритет;
          • + – Находится в интерактивном режиме.

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

          Пример вывода команды top:

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

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

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

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

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

          Итак, теперь об управлении процессами.

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

          Каждому процессу при запуске устанавливается определенный приоритет, который имеет значение от -20 до +20, где +20 — самый низкий. Приоритет нового процесса равен приоритету процесса-родителя. Для изменения приоритета запускаемой программы существует утилита nice. Пример ее использования:

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

          Команда renice служит для изменения значения nice для уже выполняющихся процессов. Суперпользователь может изменить приоритет любого процесса в системе. Другие пользователи могут изменять значение приоритета только для тех процессов, для которых данный пользователь является владельцем. При этом обычный пользователь может только уменьшить значение приоритета. Поэтому процессы с низким приоритетом не могут породить «высокоприоритетных детей».

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

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

          Два сигнала – 9 ( KILL ) и 19 ( STOP ) – всегда обрабатывает система. Первый из них нужен для того, чтобы убить процесс наверняка (отсюда и название). Сигнал STOP приостанавливает процесс: в таком состояниипроцесс не удаляется из таблицы процессов, но и не выполняется до тех пор, пока не получит сигнал 18 ( CONT) – после чего продолжит работу. В Linux сигнал STOP можно передать активному процессу с помощью управляющего символа » ^Z «.

          Обычные пользователи могут посылать сигналы только тем процессам, для которых они являются владельцами. Если в команде kill воспользоваться идентификатором процесса (PID), равным -1, то указанный в команде сигнал будет послан всем принадлежащим данному пользователю процессам. Суперпользователь root может посылать сигналы любым процессам. Когда суперпользователь посылает сигнал идентификатору -1, он рассылается всем процессам, за исключением системных. Если этим сигналом будет SIGKILL, то у простых пользователей будут потеряны все открытые ими, но не сохраненные файлы данных.

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

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

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

          Запущенный таким образом процесс будет игнорировать посылаемые ему сигналы (не игнорируются только сигналы SIGHUP и SIGQUIT). Хочу так же выделить команду pstree, которая показывает дерево процессов. Очень наглядно, кстати.

          Ну вот. как-то так. Буду рад любым комментариям и дополнениям.

          Upd 2011.11.19: небольшой рестайлинг и дополнение информации о сигналах.

          Sorry, you have been blocked

          This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data.

          What can I do to resolve this?

          You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page.

          Cloudflare Ray ID: 7d99dd76bf3a24ac • Your IP: Click to reveal 88.135.219.175 • Performance & security by Cloudflare

          All You Need To Know About Processes in Linux [Comprehensive Guide]

          In this article, we will walk through a basic understanding of processes and briefly look at how to manage processes in Linux using certain commands.

          A process refers to a program in execution; it’s a running instance of a program. It is made up of the program instruction, data read from files, other programs or input from a system user.

          Types of Processes

          There are fundamentally two types of processes in Linux:

          • Foreground processes (also referred to as interactive processes) – these are initialized and controlled through a terminal session. In other words, there has to be a user connected to the system to start such processes; they haven’t started automatically as part of the system functions/services.
          • Background processes (also referred to as non-interactive/automatic processes) – are processes not connected to a terminal; they don’t expect any user input.
          What is Daemons

          These are special types of background processes that start at system startup and keep running forever as a service; they don’t die. They are started as system tasks (run as services), spontaneously. However, they can be controlled by a user via the init process.

          Linux Process State

          Creation of a Processes in Linux

          A new process is normally created when an existing process makes an exact copy of itself in memory. The child process will have the same environment as its parent, but only the process ID number is different.

          There are two conventional ways used for creating a new process in Linux:

          • Using The System() Function – this method is relatively simple, however, it’s inefficient and has significantly certain security risks.
          • Using fork() and exec() Function – this technique is a little advanced but offers greater flexibility, speed, together with security.

          How Does Linux Identify Processes?

          Because Linux is a multi-user system, meaning different users can be running various programs on the system, each running instance of a program must be identified uniquely by the kernel.

          And a program is identified by its process ID (PID) as well as it’s parent processes ID (PPID), therefore processes can further be categorized into:

          • Parent processes – these are processes that create other processes during run-time.
          • Child processes – these processes are created by other processes during run-time.
          The Init Process

          Init process is the mother (parent) of all processes on the system, it’s the first program that is executed when the Linux system boots up; it manages all other processes on the system. It is started by the kernel itself, so in principle it does not have a parent process.

          The init process always has process ID of 1. It functions as an adoptive parent for all orphaned processes.

          You can use the pidof command to find the ID of a process:

          Find Linux Process ID

          To find the process ID and parent process ID of the current shell, run:

          Find Linux Parent Process ID

          Starting a Process in Linux

          Once you run a command or program (for example cloudcmd – CloudCommander), it will start a process in the system. You can start a foreground (interactive) process as follows, it will be connected to the terminal and a user can send input it:

          Start Linux Interactive Process

          Linux Background Jobs

          To start a process in the background (non-interactive), use the & symbol, here, the process doesn’t read input from a user until it’s moved to the foreground.

          Start Linux Process in Background

          You can also send a process to the background by suspending it using [Ctrl + Z] , this will send the SIGSTOP signal to the process, thus stopping its operations; it becomes idle:

          To continue running the above-suspended command in the background, use the bg command:

          To send a background process to the foreground, use the fg command together with the job ID like so:

          Linux Background Process Jobs

          States of a Process in Linux

          During execution, a process changes from one state to another depending on its environment/circumstances. In Linux, a process has the following possible states:

          • Running – here it’s either running (it is the current process in the system) or it’s ready to run (it’s waiting to be assigned to one of the CPUs).
          • Waiting – in this state, a process is waiting for an event to occur or for a system resource. Additionally, the kernel also differentiates between two types of waiting processes; interruptible waiting processes – can be interrupted by signals and uninterruptible waiting processes – are waiting directly on hardware conditions and cannot be interrupted by any event/signal.
          • Stopped – in this state, a process has been stopped, usually by receiving a signal. For instance, a process that is being debugged.
          • Zombie – here, a process is dead, it has been halted but it’s still has an entry in the process table.
          How to View Active Processes in Linux

          There are several Linux tools for viewing/listing running processes on the system, the two traditional and well known are ps and top commands:

          1. ps Command

          It displays information about a selection of the active processes on the system as shown below:

          List Linux Active Processes

          2. top – System Monitoring Tool

          List Linux Running Processes

          Read this for more top usage examples: 12 TOP Command Examples in Linux

          3. glances – System Monitoring Tool

          glances is a relatively new system monitoring tool with advanced features:

          Glances - Linux Process Monitoring

          There are several other useful Linux system monitoring tools you can use to list active processes, open the link below to read more about them:

          How to Control Processes in Linux

          Linux also has some commands for controlling processes such as kill, pkill, pgrep and killall, below are a few basic examples of how to use them:

          Control Linux Processes

          To learn how to use these commands in-depth, to kill/terminate active processes in Linux, open the links below:

          Note that you can use them to kill unresponsive applications in Linux when your system freezes.

          Sending Signals To Processes

          The fundamental way of controlling processes in Linux is by sending signals to them. There are multiple signals that you can send to a process, to view all the signals run:

          List All Linux Signals

          To send a signal to a process, use the kill, pkill or pgrep commands we mentioned earlier on. But programs can only respond to signals if they are programmed to recognize those signals.

          And most signals are for internal use by the system, or for programmers when they write code. The following are signals which are useful to a system user:

          • SIGHUP 1 – sent to a process when its controlling terminal is closed.
          • SIGINT 2 – sent to a process by its controlling terminal when a user interrupts the process by pressing [Ctrl+C] .
          • SIGQUIT 3 – sent to a process if the user sends a quit signal [Ctrl+D] .
          • SIGKILL 9 – this signal immediately terminates (kills) a process and the process will not perform any clean-up operations.
          • SIGTERM 15 – this a program termination signal (kill will send this by default).
          • SIGTSTP 20 – sent to a process by its controlling terminal to request it to stop (terminal stop); initiated by the user pressing [Ctrl+Z] .

          The following are kill commands examples to kill the Firefox application using its PID once it freezes:

          To kill an application using its name, use pkill or killall like so:

          Changing Linux Process Priority

          On the Linux system, all active processes have a priority and certain nice value. Processes with higher priority will normally get more CPU time than lower priority processes.

          However, a system user with root privileges can influence this with the nice and renice commands.

          From the output of the top command, the NI shows the process nice value:

          List Linux Running Processes

          Use the nice command to set a nice value for a process. Keep in mind that normal users can attribute a nice value from zero to 20 to processes they own.
          Only the root user can use negative nice values.

          To renice the priority of a process, use the renice command as follows:

          Check out our some useful articles on how to manage and control Linux processes.

          That’s all for now! Do you have any questions or additional ideas, share them with us via the feedback form below.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *