Состояния процессов в linux. Убиваем процессы в Linux — команды ps, kill и killall. Жизненный цикл процесса

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

Что такое "Процесс"

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

В системе любой процесс может выполняться в нескольких режимах:

  1. Запуск. Данный режим означает, что процесс или уже работает, или запускается.
  2. Ожидание. В данном состоянии процесс ждет получения какой-либо команды, соответственно, он не выполняется.
  3. Остановлено. Все просто - процесс был остановлен принудительно пользователем. Чтобы он продолжил свою работу, ему нужно дать соответствующий сигнал.
  4. Мертвый. Он также называется "зомби-процессом". Это когда он был убит пользователем, но все равно отображается в списке. Чаще всего это происходит из-за того, что у него были смежные процессы, которые продолжили свою работу.

Как в Linux вывести список процессов на экран

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

Способ 1: "Диспетчер задач"

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

  1. Откройте системное меню.
  2. Нажмите по кнопке "Поиск".
  3. Впишите название программы "Диспетчер задач" (в некоторых дистрибутивах она называется "Системный монитор").
  4. Кликните ЛКМ по одноименной программе.

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

Способ 2: через "Терминал"

Список процессов в Linux можно также посмотреть и в "Терминале", который запускается по нажатию клавиш Ctrl+Alt+T. Для этого существует команда:

Все просто - запускаете "Терминал", вводите команду и нажимаете Enter. Однако не тут-то было. В выдаче вы увидите не полный список процессов, а лишь те, которые были запущены в рамках работы "Терминала".

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

Например, если вы хотите посмотреть весь список процессов, но без лидеров групп, используйте эту команду:

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

Может показаться, что выводится мало информации - только время работы (TIME) и команда (CMD). Все можно решить с помощью опции "-f":

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

Заключение

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

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

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

Способ 1: Терминал

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

  1. Для начала запустите консоль, нажав на соответствующий значок в меню или используя комбинацию клавиш Ctrl + Alt + T .
  2. Пропишите команду ps , чтобы просто убедиться в ее работоспособности и ознакомиться с видом показанных данных без применения аргументов.
  3. Как видите, список процессов получился достаточно малым, обычно это не более трех результатов, поэтому стоит уделить время уже упомянутым аргументам.
  4. Чтобы отобразились сразу все процессы, стоит добавить -A . В таком случае команда выглядит как ps -A (A обязательно должна быть в верхнем регистре). После нажатия на клавишу Enter вы сразу увидите сводку строк.
  5. Предыдущая команда не отображает лидера группы (главный процесс из связки). Если вас интересуют и эти данные, здесь следует прописать ps -d .
  6. Получить большее количество полезной информации можно, просто добавив -f .
  7. Тогда полный список процессов с расширенной информацией будет вызываться через ps -Af . В таблице вы увидите UID — имя пользователя, запустившего процесс, PID — уникальный номер, PPID — номер родительского процесса, C — количество времени нагрузки на ЦП в процентах, когда активен процесс, STIME — время активации, TTY — номер консоли, откуда был совершен запуск, TIME — время работы, CMD — команда, запустившая процесс.
  8. Каждый процесс имеет свой PID (Proccess Identificator). Если вы хотите увидеть сводку о конкретном объекте, пропишите ps -fp PID , где PID — номер процесса.
  9. Отдельно хотелось бы затронуть и сортировку. Например, команда ps -FA --sort pcpu позволяет поставить все строки в порядке нагрузки на CPU, а ps -Fe --sort rss — по затрачиваемому объему оперативной памяти.

Выше мы рассказали об основных аргументах команды ps , однако присутствуют еще и другие параметры, например:

  • -H — отображение дерева процессов;
  • -V — вывод версий объектов;
  • -N — выборка всех процессов кроме заданных;
  • -С — отображение только по имени команды.

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

Способ 2: Системный монитор

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

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

  1. Запустите «Системный монитор» любым удобным методом, например, через меню.
  2. Сразу же отобразится список процессов. Вы узнаете, сколько они потребляют памяти и ресурсов ЦП, увидите пользователя, запустившего выполнение программы, а также сможете ознакомиться с другой информацией.
  3. Щелкните правой кнопкой мыши на интересующей строке, чтобы перейти в ее свойства.
  4. Здесь отображаются практически все те же данные, которые доступны к получению через «Терминал» .
  5. Используйте функцию поиска или сортировки, чтобы найти необходимый процесс.
  6. Обратите внимание и на панель сверху — она позволяет сортировать таблицу по необходимым значениям.

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

Процесс – это системный термин, который используется для описания приложения или программы. К примеру, когда мы открываем веб-браузер Google Chrome, мы можем сказать, что это процесс ответственный за запуск/выполнение Chrome, который был запущен и выполняется до тех пор пока мы не закроем браузер. Даже когда мы выполняем любую bash команду, появляется новый процесс. Если мы откроем одно и тоже приложение дважды, появится два процесса. В этом руководстве вы узнаете, как узнать список процессов Linux с помощью командной строки. Это необходимо, если вы хотите узнать какие процессы запущены в данный момент, каким пользователем запущен процесс или просто узнать какой из процессов использует больше всего ресурсов сервера.

Перед тем, как вы начнете это руководство, вам понадобится следующее:

  • Доступ к командной строке

Шаг 1 - Просмотр списка процессов Linux

Список терминов которые вам необходимо знать перед прочтением руководства:

  1. PID – идентификатор процесса. Каждый процесс имеет свой 5 значный код. Эти числа могут закончиться и начать повторяться, но в любое другое время у каждого процесса свой уникальный PID.
  2. PPID – родительский идентификатор процесса. Идентификатор процесса который запустил этот конкретный процесс.

Две самые часто используемые команды для показа списка процессов Linux это top и ps. Разница между ними заключается в том, что top чаще используется в интерактивном режиме, а ps больше используется в скриптах, в сочетании с другими bash командами.

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

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

  • h или ? – отобразить окно помощи со всеми командами и другой полезной информацией.
  • space – нажатие пробела на вашей клавиатуре вручную обновит таблицу процессов.
  • f – добавить поле для отображения в новом окне или удалить определенные поля в таблице.
  • q – выйти из приложения или дополнительных окон принадлежащих к нему. К примеру, после использования функции f .
  • l – включить отображение информации о средней загрузке и времени работы.
  • m – включить отображение информации о памяти.
  • P (Shift + p) – отсортировать процессы по количеству используемой памяти.
  • s – изменить задержку между обновлениями списка (вам будет предложено ввести значение в секундах).

Вы также можете использовать определенные опции с командой top:

  • -d delay – укажите задержку между обновлениями вместо delay .
  • -n number – обновить страницу определенное число раз и выйти из приложения. Вместо number введите значение.
  • -p pid – отображать и контролировать процессы только с определенным (pid ).
  • -q – обновлять без какой-либо задержки.

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

Также, вы можете использовать команду man top для просмотра полезной информации об этих командах.

Другие полезные применения команды top:

  • Для отображения процессов определенного пользователя, вы можете использовать это: top -u user
  • Для закрытия процесса, нажмите в окне приложения top клавишу k на клавиатуре. Далее, вам будет предложено вписать идентификатор процесса (pid ), который вы хотите закрыть.
  • Вы можете сохранить текущие настройки команды top используя сочетание клавиш Shift + W . Эти настройки будут сохранены в директории /root/.toprc

ps – Еще одна полезная команда для отображения списка процессов Linux. Вот несколько опций часто используемых с этой командой:

  • -e – отображение всех процессов.
  • -f – полное форматирование списка.
  • -r – отображение запущенных процессов.
  • -u – опция для показа процессов определенного пользователя или пользователей.
  • –pid – опция для фильтрации процессов по PID.
  • –ppid – опция для фильтрации процессов по родительскому PID.
  • -C – фильтровать процессы по их имени или команде.
  • -o – отображение информации, связанной с пробелом или списком ключевых слов, разделенных запятыми.

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

  1. ps -ef – отобразит список процессов, которые запущены прямо сейчас (еще одна похожая команда ps aux)
  2. ps -f -u user1,user2 – отобразит все процессы основанные на предоставленном UID (ID пользователя или имени пользователя).
  3. ps -f –pid id – отобразит процессы основанные на pid. Введите идентификатор процесса вместо id . Может быть использована вместе с PPID .
  4. ps -C command/name – фильтрация процессов по их имени или команде.
  5. ps aux –sort=-pcpu,+pmem – отобразит процессы потребляющие большое количество ресурсов ЦПУ.
  6. ps -e -o pid,uname,pcpu,pmem,comm – используется для фильтрации определенных столбцов с последующим их отображением.
  7. ps -e -o pid,comm,etime – эта команда отобразит время прошедшее с запуска процесса.

Шаг 2 - Закрытие и расстановка приоритета процессов

В предыдущем шаге мы уже рассказывали о том, как можно закрыть процесс с помощью команды top. Этот же результат может быть достигнут при помощи команды kill. К примеру:

kill pid – впишите вместо PID идентификатор процесса, который вы хотите закрыть. Если процесс довольно упрямый и не хочет быть закрыт, вы можете использовать команду: kill -9 pid.

Еще одной командой для управления процессами является NICE. Обычно она используется для расстановки приоритетов для процессов, когда на вашей системе их запущено действительно много. В этом случае ваша система узнает какие из процессов являются важными и установит для них более высокий приоритет. Проще говоря, она помогает вам расставить приоритеты процессов от более важных к менее важным. Система будет запускать процесс, который имеет меньший приоритет только в том случае, если для этого имеется достаточно ресурсов ЦПУ. Этой команде можно задать значение от -20 до 19 , чем меньше значение, тем выше приоритет процесса. Стандартный приоритет для всех приложений 0 . Основным синтаксисом будет:

  • nice -n ‘значение’ process name – Пример: nice -n 10 name. Это начнет новый процесс с выбранным приоритетом (10 ).
  • Если вы хотите задать значение приоритета для уже запущенного приложения используйте: renice ‘значение’ -p ‘PID’ – Пример: renice ’10’ -p ‘54125’.

Заключение

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

Как вы думаете, операционная система Linux может автоматически позаботиться сама о себе? Когда работает все нормально или вам не нужны никакие нестандартные возможности - вполне да. Но иногда может понадобиться ваше вмешательство в ее работу.

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

В этой статье будет затронута обширная тема, мы рассмотрим такие возможности:

  • Просмотр запущенных процессов
  • Просмотр информации о процессах
  • Поиск процессов в Linux
  • Изменение приоритета процессов
  • Завершение процессов
  • Ограничение памяти доступной процессу

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

Начнем с того, что разберемся в терминах. По сути, процесс - это каждая программа. Как я уже говорил для каждой запускаемой программы создается отдельный процесс. В рамках процесса программе выделяется процессорное время, оперативная память и другие системные ресурсы. У каждого процесса есть свой идентификатор, Proccess ID или просто PID, по ним, чаще всего и определяются процессы Linux. PID определяется неслучайно, как я уже говорил, программа инициализации получает PID 1, а каждая следующая запущенная программа - на единицу больше. Таким образом PID пользовательских программ доходит уже до нескольких тысяч.

На самом деле, процессы Linux не настолько абстрактны, какими они вам сейчас кажутся. Их вполне можно попытаться пощупать. Откройте ваш файловый менеджер, перейдите в корневой каталог, затем откройте папку /proc. Видите здесь кучу номеров? Так вот это все - PID всех запущенных процессов. В каждой из этих папок находится вся информация о процессе.

Например, посмотрим папку процесса 1. В папке есть другие под каталоги и много файлов. Файл cmdline содержит информацию о команде запуска процесса:

cat /proc/1/cmdline

/usr/lib/systemd/systemd

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

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

В Linux есть очень большое количество утилит для решения различных задач по управлению процессами. Это и такие многофункциональные решения, как htop, top, а также простые утилиты, например, ps, kill, killall, who и т д. Я не буду рассматривать в этой статье графические утилиты, и top тоже рассматривать не буду. Первое потому что слишком просто, второе - потому что htop лучше. Мы остановимся на работе с программой htop и ее аналогами в форме утилит в стиле GNU, одна утилита - одна функция.

Давайте установим htop, если она у вас еще не установлена. В Ubuntu это делается так:

sudo apt install htop

В других дистрибутивах вам нужно просто использовать свой менеджер пакетов. Имя пакета такое же.

Посмотреть запущенные процессы

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

Открыв htop, мы сразу видим список запущенных процессов. Конечно, здесь отображены не все процессы linux, их-то в системе очень много, вы уже знаете, все они на один экран не поместятся. По умолчанию выводятся процессы, запущенные от имени вашего пользователя:

Вы можете увидеть такую информацию о процессе:

  • PID - идентификатор процесса
  • USER - пользователь, от которого был запущен процесс
  • PRI - приоритет процесса linux на уровне ядра (обычно NI+20)
  • NI - приоритет выполнения процесса от -20 до 19
  • S - состояние процесса
  • CPU - используемые ресурсы процессора
  • MEM - использованная память
  • TIME - время работы процесса

К отображению можно добавить и дополнительные параметры, но эти главные. Добавить параметры можно с помощью меню Setup. Там все очень просто, читайте подсказки и следуйте указаниям. Например, добавлен параметр PPID:

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

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

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

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

  • -e - вывести информацию обо всех процессах
  • -a - вывести информацию обо всех наиболее часто запрашиваемых процессах
  • -t - показывать только процессы из этого терминала
  • -p - показывать информацию только об указанном процессе
  • -u - показывать процессы только определенного пользователя

Одним словом, чтобы посмотреть все активные на данный момент процессы в linux, используется сочетание опций aux:

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

ps aux --sort=%mem

Список будет отсортирован в обратном порядке, внизу значения больше, вверху - меньше. Если нужно в обратном порядке, добавьте минус:

ps aux --sort=-%cpu

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

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

Поиск процессов в Linux

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

Чтобы найти процесс linux в htop можно использовать кнопку F3. Нажмите F3 и наберите нужное слово. Дальше чтобы перейти к следующему вхождению нажимайте F2 или Esc для завершения поиска:

Для поиска процессов в htop можно использовать также фильтр htop. Нажмите F4, введите слово и будут выведены только процессы linux, имя которых включает это слово.

В утилите ps фильтрации нет, но зато мы можем использовать утилиту grep, перенаправив вывод ps на нее чтобы найти процесс linux:

ps aux | grep chromium

Это очень часто употребляемая команда.

Изменение приоритета процессов

Приоритет процесса linux означает, насколько больше процессорного времени будет отдано этому процессу по сравнению с другими. Так мы можем очень тонко настроить какая программа будет работать быстрее, а какая медленнее. Значение приоритета может колебаться от 19 (минимальный приоритет) до -20 - максимальный приоритет процесса linux. Причем, уменьшать приоритет можно с правами обычного пользователя, но чтобы его увеличить нужны права суперпользователя.

В htop для управления приоритетом используется параметр Nice. Напомню, что Priv, это всего лишь поправка, она в большинстве случаев больше за Nice на 20. Чтобы изменить приоритет процесса просто установите на него курсор и нажимайте F7 для уменьшения числа (увеличения приоритета) или F8 - для увеличения числа.

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

nice -n 10 apt-get upgrade

Или изменить приоритет для уже существующего по его pid:

renice -n 10 -p 1343

Завершение процессов в Linux

Если процесс завис и не отвечает, его необходимо завершить. В htop, чтобы убить процесс Linux, просто установите курсор на процесс и нажмите F9:

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

  • SIGKILL - попросить процесс сохранить данные и завершится
  • SIGTERM - завершить процесс немедленно, без сохранения

Вообще сигналов есть несколько десятков, но мы не будем их рассматривать. Отправим сигнал SIGKILL:

Также можно воспользоваться утилитой kill:

Также можно уничтожить процесс по имени:

killall chromium

Ограничение процессов

Управление процессами в Linux позволяет контролировать практически все. Вы уже видели что можно сделать, но можно еще больше. С помощью команды ulimit и конфигурационного файла /etc/security/limits.conf вы можете ограничить процессам доступ к системным ресурсам, таким как память, файлы и процессор. Например, вы можете ограничить память процесса Linux, количество файлов и т д.

Запись в файле имеет следующий вид:

<домен> <тип> <элемент> <значение>

  • домен - имя пользователя, группы или UID
  • тип - вид ограничений - soft или hard
  • элемент - ресурс который будет ограничен
  • значение - необходимый предел

Жесткие ограничения устанавливаются суперпользователем и не могут быть изменены обычными пользователями. Мягкие, soft ограничения могут меняться пользователями с помощью команды ulimit.

Рассмотрим основные ограничения, которые можно применить к процессам:

  • nofile
  • as - максимальное количество оперативной памяти
  • stack - максимальный размер стека
  • cpu - максимальное процессорное время
  • nproc - максимальное количество ядер процессора
  • locks - количество заблокированных файлов
  • nice - максимальный приоритет процесса

Например, ограничим процессорное время для процессов пользователя sergiy:

sergiy hard nproc 20

Посмотреть ограничения для определенного процесса вы можете в папке proc:

cat /proc/PID/limits

Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 204800 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 23562 23562 processes
Max open files 1024 4096 files
Max locked memory 18446744073708503040 18446744073708503040 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 23562 23562 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us

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

Вот опции команды:

  • -S - мягкое ограничение
  • -H - жесткое ограничение
  • -a - вывести всю информацию
  • -f - максимальный размер создаваемых файлов
  • -n - максимальное количество открытых файлов
  • -s - максимальный размер стека
  • -t - максимальное количество процессорного времени
  • -u - максимальное количество запущенных процессов
  • -v - максимальный объем виртуальной памяти

Например, мы можем установить новое ограничение для количества открываемых файлов:

Теперь смотрим:

Установим лимит оперативной памяти:

ulimit -Sv 500000

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

Выводы

Вот и все. Теперь управление процессами в Linux не вызовет у вас проблем. Мы рассмотрели очень даже подробно эту тему. Если у вас остались вопросы или есть предложения по дополнению статьи, пишите в комментариях!

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

Процесс - это объект ОС Linux, который состоит из адресного пространства памяти и набора структур данных. По сути, процесс это запущенная программа или служба.

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

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

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

* Идентификатор процесса (PID) . Каждый процесс в системе имеет уникальный идентификатор. Каждый новый запущенный процесс получает номер на единицу больше предыдущего.

* Идентификатор родительского процесса (PPID) . Данный атрибут процесс получает во время своего запуска и используется для получения статуса родительского процесса.

* Реальный и эффективный идентификаторы пользователя (UID,EUID) и группы (GID, EGID) . Данные атрибуты процесса говорят о его принадлежности к конкретному пользователю и группе. Реальные идентификаторы совпадают с идентификаторами пользователя, который запустил процесс, и группы, к которой он принадлежит. Эффективные - от чьего имени был запущен процесс. Права доступа процесса к ресурсам ОС Linux эффективными идентификаторами. Если на исполняемом файле программы установлен специальный бит SGID или SUID, то процесс данной программы будет обладать правами доступа владельца исполняемого файла.
Для управления процессом (например, kill) используются реальные идентификаторы. Все идентификаторы передаются от родительского процесса к дочернему.
Для просмотра данных атрибутов можно воспользоваться командой , задав желаемый формат отображения колонок.

* Приоритет или динамический приоритет (priority) и относительный или статический (nice) приоритет процесса .
Статический приоритет или nice-приоритет лежит в диапазоне от -20 до 19, по умолчанию используется значение 0. Значение –20 соответствует наиболее высокому приоритету, nice-приоритет не изменяется планировщиком, он наследуется от родителя или его указывает пользователь. Динамический приоритет используется планировщиком для планирования выполнения процессов. Этот приоритет хранится в поле prio структуры task_struct процесса. Динамический приоритет вычисляется исходя из значения параметра пicе для данной задачи путем вычисления надбавки или штрафа, в зависимости от интерактивности задачи. Пользователь имеет возможность изменять только статический приоритет процесса. При этом повышать приоритет может только root. В ОС Linux существуют две команды управления приоритетом процессов: nice и renice.

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

TASK_RUNNING - процесс готов к выполнению или выполняется (runnable). Обозначается символом R.

TASK_INTERRUPTIBLE - ожидающий процесс (sleeping). Данное состояние означает, что процесс инициализировал выполнение
какой-либо системной операции и ожидает ее завершения. К таким операциям относятся ввод/вывод, завершение дочернего процесса
и т.д. Процессы с таким состоянием обозначаются символом S.

TASK_STOPPED - выполнение процесса остановлено (stopping). Любой процесс можно остановить. Это может делать как система,
так и пользователь. Состояние такого процесса обозначается символом Т.

TASK_ZOMBIE - завершившийся процесс (zombie). Процессы данного состояния возникают в случае, когда родительский процесс
не ожидая завершения дочернего процесса, продолжает параллельно работать. Процессы с таким состоянием обозначаются символом Z.
Завершившиеся процессы больше не выполняются системой, но по-прежнему продолжают потреблять ее не вычислительные ресурсы.

TASK_UNINTERRUPTIBLE -непрерываемый процесс (uninterruptible). Процессы в данном состоянии ожидают завершения операции
ввода - вывода с прямым доступом в память. Такой процесс нельзя завершить, пока не завершится операция ввода/вывода.
Процессы с таким состоянием обозначаются символом D. Состояние аналогично TASK_INTERRUPTIBLE, за исключением того, что процесс
не возобновляет выполнение при получении сигнала. Используется в случае, когда процесс должен ожидать беспрерывно или
когда ожидается, что некоторое событие может возникать достаточно часто. Так как задача в этом состоянии не отвечает
на сигналы, TASK_UNINTERRUPTIBLE используется менее часто, чем TASK_INTERRUPTIBLE.

Типы процессов В Linux процессы делятся на три типа:

  • Системные процессы - являются частью ядра и всегда расположены в оперативной памяти. Системные процессы не имеют соответствующих им программ в виде исполняемых файлов и запускаются при инициализации ядра системы. Выполняемые инструкции и данные этих процессов находятся в ядре системы, таким образом, они могут вызывать функции и обращаться к данным, недоступным для остальных процессов. Системными процессами, например, являются: shed (диспетчер свопинга), vhand (диспетчер страничного замещения), kmadaemon (диспетчер памяти ядра).
  • Демоны - это неинтерактивные процессы, которые запускаются обычным образом - путем загрузки в память соответствующих им программ (исполняемых файлов), и выполняются в фоновом режиме. Обычно демоны запускаются при инициализации системы (но после инициализации ядра) и обеспечивают работу различных подсистем: системы терминального доступа, системы печати, с истемы сетевого доступа и сетевых услуг, почтовый сервер, dhcp-сервер и т. п. Демоны не связаны ни с одним пользовательским сеансом работы и не могут непосредственно управляться пользователем. Большую часть времени демоны ожидают пока тот или иной процесс запросит определенную услугу, например, доступ к файловому архиву или печать документа.
  • Прикладные (пользовательские) процессы . К прикладным процессам относятся все остальные процессы, выполняющиеся в системе. Как правило, это процессы, порожденные в рамках пользовательского сеанса работы. Например, команда ls породит соответствующий процесс этого типа. Важнейшим прикладным процессом является командный интерпретатор (shell), который обеспечивает вашу работу в LINUX. Он запускается сразу же после регистрации в системе. Прикладные процессы linux могут выполняться как в интерактивном, так и в фоновом режиме, но в любом случае время их жизни (и выполнения) ограничено сеансом работы пользователя. При выходе из системы все прикладные процессы будут уничтожены.

Иерархия процессов

В Linux реализована четкая иерархия процессов в системе. Каждый процесс в системе имеет всего одного родителя и может иметь один или более порожденных процессов.

Рис. 3.1 – Фрагмент иерархии процессов

На последней фазе загрузки ядро монтирует корневую файловую систему и формирует среду выполнения нулевого процесса, создавая пространство процесса, инициализируя нулевую точку входа в таблице процесса и делая корневой каталог текущим для процесса. Когда формирование среды выполнения процесса заканчивается, система исполняется уже в виде нулевого процесса. Нулевой процесс "ветвится", запуская fork прямо из ядра, поскольку сам процесс исполняется в режиме ядра. Код, исполняемый порожденным процессом 1, включает в себя вызов системной функции exec, запускающей на выполнение программу из файла "/etc/init". В отличие от нулевого процесса, который является процессом системного уровня, выполняющимся в режиме ядра, процесс 1 относится к пользовательскому уровню. Обычно процесс 1 именуется процессом init, поскольку он отвечает за инициализацию новых процессов. На самом деле вы можете поместить любую программу в /sbin/init и ядро запустит её как только закончит загружаться. Задачей init"а является запуск всего остального нужным образом.

Init читает файл /etc/inittab, в котором содержатся инструкции для дальнейшей работы. Первой инструкцией, обычно, является запуск скрипта инициализации. В системах, основанных на Debian, скриптом инициализации будет /etc/init.d/rcS, в Red Hat - /etc/rc.d/rc.sysinit. Это то место где происходит проверка и монтирование файловых систем (/etc/fstab), установка часов системного времени, включение своп-раздела, присвоение имени хоста и т.д. Далее будет вызван следующий скрипт, который переведёт нас на "уровень запуска" по умолчанию. Это подразумевает просто некоторый набор демонов, которые должны быть запущены.

Syslogd (/etc/init.d/syslogd) – скрипт, отвечающий за запуск и остановку системного логгера (система журнальной регистрации событий SYSLOG, позволяет записывать системные сообщения в файлы журналов /var/log).

Xined –Демон Интернет-служб, управляет сервисами для интернета. Демон прослушивает сокеты и если в каком-то из них есть сообщение определяет какому сервису принадлежит данный сокет и вызывает соответствующую программу для обработки запроса.

crond – Демон cron отвечает за просмотр файлов crontab и выполнение, внесенных в него команд в указанное время для опредленного пользователя. Програма crontab(1) спілкується з crond через файл cron.update, який повинен знаходитись разом з рештою файлів каталогу crontab, як правило - /var/spool/cron/crontabs.

Последним важным действием init является запуск некоторого количества getty. Mingetty – виртуальные терминалы, назначением которых является слежение за консолями пользователей.

getty запускает программу login – начало сеанса роботы пользователя в системе. Задача login"а – регистрация пользователя в системе. А уже после успешной регистрации чаще всего грузиться командный интерпретатор пользователя (shell), например, bash, вернее после регистрации пользователя грузится программа, указанная для данного пользователя в файле /etc/passwd (в большинстве случаев это bash).

2. Запуск процессов

Существует два пути запуска процессов в зависимости от типа процесса.

Для пользовательских процессов запуск осуществляется в интерактивном режиме путем ввода произвольной команды или запуска произвольного скрипта. Для системных процессов и демонов используются инициализационные скрипты (init-скрипты). Данные скрипты используется процессом init для запусков других процессов при загрузке ОС. Инициализационные скрипты хранятся в каталоге /etc. В данном каталоге существуют вложенные каталоги, именуемые rcO.d - rc6.d, каждый из которых ассоциирован с определенным уровнем выполнения (runlevel). В каждом из этих каталогов находятся символьные ссылки на инициализационные скрипты, непосредственно находящиеся в каталоге /etc/rc.d/init.d .

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

Просмотр init-скриптов

Bee init-скрипты возможно повторно запускать или останавливать, тем самым управляя статусом сервиса, к которому они принадлежат. Запуск данных скриптов осуществляется из командной строки и имеет следующий синтаксис:

/etc/init.d/script-name start|stoplrestart|condrestart|status|reload

Здесь в качестве script-name используется конкретное имя init-скрипта, а в качестве аргументов могут выступать следующие значения:

* start (Запуск сервиса); * stop (Остановка сервиса); * restart (Остановка и последующий запуск сервиса); * condrestart (Условная остановка и последующий запуск сервиса); * status (Получение статуса состояния сервиса); * reload (Повторное считывание конфигурационного файла сервиса). Например, для условного перезапуска сервиса sshd используется следующая команда: # /etc/init.d/sshd condrestart Stopping sshd: [ ok ] Starting sshd: [ ok ] Условный перезапуск сервиса sshd.

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

В ОС Linux для управления сервисами, помимо непосредственного обращения к файлу init-скрипта, существует специальная команда service (второй способ), в качестве аргумента которой необходимо указать аргументы аналогичные тем, что используются при непосредственном запуске демонов через init-скрипты:

# service sshd reload Reloading sshd: [ ok ] Использование команды service.

В данном примере осуществляется повторное считывание конфигурационного файла сервиса sshd.

Однако управлять демонами в большинстве случаем может только root.

Команды запуска процессов

Чтобы завершить какой-нибудь процесс, нужно послать ему сигнал с помощью команды kill. Для этого необходимо узнать Pid процесса с помощью команды ps (например, Pid процесса равен 11839) и послать процессу сигнал на завершение, например сигнал SIGKILL:

или kill –SIGKILL 11839

или kill –KILL 11839

Что же такое сигналы?

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

Прежде всего, каждый сигнал имеет собственное имя и номер. Имена всех сигналов начинаются с последовательности SIG. Например, SIGALRM – генерируется, когда таймер, установленной функцией alarm(), отмерит указанный промежуток времени. Linux поддерживает 31 сигнал (номера от 1 до 31).

Сигналы могут порождаться различными условиями:

1. Генерироваться терминалом, при нажатии определенной комбинации клавиш, например, нажатие Ctrl+C генерирует сигнал SIGINT, таким образом можно прервать выполнение программы, вышедшей из-под контроля;

2. Аппаратные ошибки - деление на 0, ошибка доступа к памяти и прочие – также приводят к генерации сигналов. Эти ошибки обычно обнаруживаются аппаратным обеспечением, которое извещает ядро об их появлении. После этого ядро генерирует соответствующий сигнал и передает его процессу, который выполнялся в момент появления ошибки. Например, сигнал SIGSEGV посылается процессу в случае попытки обращения к неверному адресу в памяти.

3. Другим процессом (в том числе и ядром и системным процессом), выполнившим системный вызов передачи сигнала kill();

4. При выполнении команды kill.

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

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

1. Принудительно проигнорировать сигнал (практически любой сигнал может быть проигнорирован, кроме SIGKILL и SIGSTOP).

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

3. Перехватить сигнал (выполнить обработку сигнала, специфицированную пользователем).

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

Задача (job) - это просто рабочая единица командного процессора.

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

  • интерактивное задание (foreground job) - Выполняемое в командном процессоре, занимающее сеанс командного процессора, так что вы не можете выполнить другую команду.
  • фоновое задание (background job) - Выполняемое в командном процессоре, но не занимающее сеанс командного процессора, так что вы можете выполнить другую команду в этом же командном процессоре.
  • приостановить (suspend) - Временно приостановить интерактивный процесс.
  • возобновить (resume) - Вернуться к вьполнению приостановленной задачи.

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

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

Чтобы прекратить выполнение программы, работающей в фоновом режиме, вы можете перевести ее в интерактивный режим с помощью команды fg и затем нажать Ctrl-С, или использовать команду kill.