Linux посмотреть привилегии процесса
ps (processes status — статус процессов) — это встроенная утилита Unix/Linux для просмотра информации, касающейся выбора запущенных процессов в системе: она считывает эту информацию из виртуальных файлов в файловой системе /proc. Это одна из важных утилит для системного администрирования, особенно в рамках мониторинга процессов, чтобы помочь вам понять, что происходит в системе Linux.
Программа ps имеет множество опций для манипулирования выходными данными, однако вы найдёте небольшое количество из них практически полезными для ежедневного использования.
Утилита ps выводит снимок процессов на вашем компьютере Linux. Вы сможете найти процессы по имени, пользователю или даже терминалу с таким количеством деталей, сколько вам нужно. В этой статье подготовлено множество примеров использования ps.
Управление процессами в Linux
Сердцем всех Linux и Unix-подобных операционных систем является ядро. Среди его многочисленных обязанностей — распределение системных ресурсов, таких как оперативная память и процессорное время. Они должны выполняться в режиме реального времени, чтобы все запущенные процессы получали свою справедливую долю в соответствии с приоритетом каждой задачи.
Иногда задачи могут блокироваться, или зацикливаться, или перестать отвечать по другим причинам. Или они могут продолжать работать, но сожрать слишком много процессорного времени или оперативной памяти, или вести себя каким-то похожим антисоциальным образом. Иногда задачи должны быть убиты для сохранения стабильной работы системы. Разумеется, первых шаг заключается в идентификации проблемного процесса.
Но, возможно, у вас вообще нет проблем с задачами или производительностью. Возможно, вам просто любопытно, какие процессы выполняются на вашем компьютере, и вы хотели бы заглянуть под капот операционной системы Linux. Команда ps удовлетворяет обоим этим требованиям. Она даёт вам снимок того, что происходит внутри вашего компьютера «прямо сейчас».
ps достаточно гибка, чтобы предоставить вам именно ту информацию, которая вам нужна, именно в том формате, который вам нравится. На самом деле, у ps очень много опций. Опции, описанные здесь, будут соответствовать большинству обычных потребностей. Если вы хотите изучить команду ps ещё глубже, то знакомство с командой ps в этой статье и примеры использования ps облегчат вам восприятие справочной страницы.
Программа для показа процессов в Linux
Самый простой способ использовать ps — запустить её без параметров:
ps
ps покажет список процессов в данном терминале.
В выводе присутствует четыре столбца:
- PID: идентификационный номер процесса.
- TTY: имя консоли, на которой пользователь выполнил вход.
- TIME: количество времени центрального процессора, которое потребил процесс.
- CMD: имя команды, которая запустила процесс
Как увидеть все процессы в Linux
Добавление опции -e (выбрать все процессы) сделает так, что ps перечислит процессы, которые были запущены всеми пользователями, а не только пользователем, который запускает команду ps. Поскольку это будет длинный список, то вы можете добавить команду less.
Список процессов с возможностью прокрутки в команде less:
Теперь записей о процессах намного больше, но мы видим те же четыре столбца, что и раньше. Вопросительный знак (?) в столбце TTY означает, что процесс запускался не из окна терминала.
Отображение иерархии процессов (дерево процессов в Linux)
Если вы видите, какие процессы запустили другие процессы, то иногда это может помочь выяснить проблему или определить конкретный процесс. Для этого мы используем опцию -H.
Отступы указывают, какие процессы являются родителями каких других процессов.
Чтобы добавить немного ясности, мы можем попросить ps добавить несколько линий ASCII и нарисовать иерархию в виде дерева. Это можно сделать опцией --forest.
Это позволить проще отслеживать, какие процессы являются родителями других процессов.
Как напечатать дерево определённого процесса
Вы можете получить дерево процессов только нужной вам программы следующим образом (замените sshd на интересующий вас процесс):
Об опции -C будет рассказано далее в этой статье.
Фильтрация вывода ps по определённым строкам (по имени команды, например)
В этом случае выходные данные представляют собой одну запись для интересующего нас процесса. Конечно, если бы мы запустили несколько экземпляров Firefox, в списке было бы более одного элемента.
Больше столбцов в выводе ps
Чтобы добавить дополнительные столбцы к выводу, используйте параметр -f (полный формат).
Дополнительный набор столбцов включён в вывод ps.
Добавлены следующие новые столбцы:
- UID: идентификатор пользователя владельца этого процесса.
- PPID: идентификатор родительского процесса.
- C: Количество детей, которые есть у процесса.
- STIME: Время начала. Время, когда процесс был запущен.
Используя опцию -F (дополнительный полный формат), мы можем получить ещё больше столбцов:
Если у вас маленькое окно терминала, то столбцы, которые мы получаем в этот раз, требуют прокрутки экрана в сторону, чтобы показать их все. Нажатие клавиши «Стрелка вправо» смещает дисплей влево.
Теперь добавились следующие столбцы:
- SZ: размер страниц ОЗУ образа процесса.
- RSS: резидентный размер набора. Это не подкачанная физическая память, используемая процессом.
- PSR: процессор, которому назначен процесс.
Нужно ли указывать дефис перед опциями ps
В некоторых примерах вы можете увидеть использование ps с опциями без дефиса или с длинными вариантами написания опций в стиле GNU. Для совместимости, ps поддерживает все три формата. Опции без дефиса — это стиль BSD и значение опций с дефисом и без может быть различным!
Пример показа процессов в формате BSD:
В этой команде значение опций следующее:
- u — ориентированный на пользователя формат
- a — убирает ограничение «только свои процессы»
- x — убирает ограничение «только процессы с терминалом»
Проще говоря, если использовать вместе a и x, то будут показаны все процессы.
Нужно быть аккуратным, и не забывать ставить дефис если вы используете опции UNIX, поскольку в случае неопределённости ps будет пытаться трактовать в разных вариантах. В этой инструкции кроме рассмотренного примера везде используются опции UNIX.
Поиск процессов по идентификатору процесса
Как только вы нашли идентификатор процесса для интересующего вас процесса, вы можете использовать его с командой ps, чтобы вывести подробную информацию об этом процессе. Для этого используйте спользуйте параметр -p после которого укажите число — идентификатор процесса:
Можно указывать более чем один идентификатор процесса, перечислив их через запятую или через пробел.
Поиск процессов по имени команды
Опция -C КОМАНДА позволяет вам искать процесс, используя имя команды. То есть имя команды, которая запустила процесс. Это несколько отличается от строки команды, которая может включать имена путей и параметры или опции.
Выведена информация только о процессе, запущенным указанной командой:
Процессов может быть несколько если запущено множество экземпляров данной команды:
Как увидеть потоки процесса
Чтобы вывести все потоки процесса, используйте флаг -H. Опция -L приведёт к показу столбца LWP (light weight process — процесс с малым весом), а также столбца NLWP (number of light weight process — число процессов с малым весом).
Как увидеть процессы определённого пользователя
Чтобы увидеть процессы, принадлежащие конкретному пользователю, используйте опцию -u СПИСОК ПОЛЬЗОВАТЕЛЕЙ:
Отображаются процессы, принадлежащие учётной записи пользователя mial.
Как вывести все процессы запущенные пользователем root
Это частный случай показа процессов определённого пользователя.
Команда ниже позволяет вам просматривать каждый процесс, работающий с привилегиями пользователя root (действительный и эффективный идентификатор) в формате пользователя.
Просмотр групповых процессов
Если вы хотите перечислить все процессы, принадлежащие определённой группе (реальный идентификатор группы (RGID) или имя), введите:
Чтобы вывести список всех процессов, принадлежащих эффективному имени группы (или сеанса), введите.
Листинг процессов по терминалам
Чтобы увидеть процессы, связанные с TTY, используйте опцию -t УКАЖИТЕ TTY. При использовании без номера TTY опция -t сообщает о процессах, связанных с текущим окном терминала.
Все перечисленные процессы связаны с pts/1.
Выбор столбцов для отображения
С опцией -o ФОРМАТ вы можете выбрать, какие столбцы вы хотите включить в вывод ps. Столбцы нужно указывать по имени. В руководстве по ps:
вы найдёте длинный список имён столбцов в разделе STANDARD FORMAT SPECIFIERS.
В следующем примере мы выводим потребление процессом времени центрального процессора (pcpu), потребление процессором памяти (pmem) и запустившая его команда вместе с опциями (args):
Обратите внимание, что опция -o не добавляет столбцы в стандартным, а выводит только запрошенные поля.
Сортировка вывода по столбцам
Вы можете отсортировать вывод, используя опцию --sort. Давайте отсортируем вывод по столбцу CPU:
Дефис «-» означает сортировку от большего к меньшему.
Чтобы увидеть десять самых ресурсоемких процессов, передайте вывод через команду head:
Мы получаем отсортированный, усечённый список.
Если мы добавим больше столбцов для вывода, мы сможем отсортировать по большему количеству столбцов.
Без дефиса или со знаком «+» сортировка выполняется от меньшего к большему.
Добавим в сортировку столбец pmem:
Сортировка по-прежнему выполняется по значению pcpu, но если для каких-то записей эти значения одинаковые, то выполняется сортировка по pmem для этих значений.
Давайте сделаем вывод результатов немного более полезным и добавим столбец идентификатора процесса (pid), чтобы мы могли видеть номер процесса каждого процесса в нашем листинге.
Теперь мы можем идентифицировать процессы.
Все возможные поля ps
Чтобы увидеть все возможные для вывода поля ps выполните такую команду:
Эти поля вы можете применять с опцией -o.
Примеры настраиваемого вывода ps
Команда ниже позволяет вам увидеть PID, PPID, имя пользователя и команду процесса.
Ниже приведён ещё один пример пользовательского формата вывода, показывающий группу файловой системы, значение nice, время начала и истекшее время процесса.
Как найти имя процесса по PID
Чтобы найти имя процесса, используя его PID.
Показать родительский и дочерний процессы
Чтобы выбрать конкретный процесс по его имени, используйте флаг -C, это также отобразит все его дочерние процессы.
Чтобы найти все PID всех экземпляров процесса, что полезно при написании сценариев, которые должны считывать PID из выходных данных (из стандартного входа).
Как выключить процесс по идентификатору процесса
Мы рассмотрели ряд способов идентификации процессов, включая имя, команду, пользователя и терминал. Мы также рассмотрели способы идентификации процессов по их динамическим атрибутам, таким как использование процессора и памяти.
Так или иначе, мы можем определить процессы, которые работают. Зная их идентификатор процесса, мы можем (если нужно) остановить любой из этих процессов с помощью команды kill. Если бы мы хотели убить процесс 898, мы бы использовали этот формат:
Помните о том, что в некоторых случаях процесс не завершается и при этом не выводится никаких ошибок или предупреждений. На самом деле, данная команда является «рекомендательной», она «просит» процесс завершиться. Подробности смотрите в статье «Почему команда kill не убивает процесс?».
Как выключить процесс зная его имя
Команда pkill позволяет вам убивать процессы по имени. Убедитесь, что вы определили правильный процесс! Эта команда завершит процесс top.
Как остановить несколько процессов по имени
Если у вас запущено несколько копий процесса, или процесс породил несколько дочерних процессов (как это может сделать Google Chrome), как вы можете выключить их? Это так же просто. Мы используем команду killall.
У нас запущено два экземпляра top:
Мы можем завершить их обоих с помощью этой команды:
Отсутствие ответа означает отсутствие проблем, т. е. оба эти процессы были остановлены.
Прежде чем убить процесс
Убедитесь, что это тот, который вам нужен, и убедитесь, что это не вызовет никаких проблем. В частности, стоит проверить с помощью параметров -H и --forest, чтобы убедиться, что в нем нет важных дочерних процессов, о которых вы забыли.
Устранение неполадок производительности системы Linux
Если ваша система не работает должным образом, например, если она необычно медленная, вы можете выполнить некоторые неполадки системы следующим образом.
Чтобы найти все процессы, потребляющие больше всего памяти и ЦПУ в Linux:
Вывод информации о безопасности
Показать контекст безопасности (специально для SELinux) можно следующим образом:
С помощью этой команды вы также можете отобразить информацию о безопасности в определённом пользователем формате:
Выполните мониторинг процессов в режиме реального времени с помощью утилиты watch
Наконец, поскольку ps отображает статическую информацию, вы можете использовать утилиту watch для непрерывного обновления информации на экране и мониторинга процессов в режиме реального времени с повторяющимся выводом. В этом примере информация будет одновляться через каждую секунду. Укажите свою собственную команду ps для соответствия вашей цели.
Перевод статьи подготовлен специально для студентов курса «Администратор Linux».
Привилегии (capabilities) используются всё больше и больше во многом благодаря SystemD, Docker и оркестраторам, таким как Kubernetes. Но, как мне кажется, документация немного сложна для понимания и некоторые части реализации привилегий для меня оказались несколько запутанными, поэтому я и решил поделиться своими текущими знаниями в этой короткой статье.
Самая важная ссылка по привилегиям — это man-страница capabilities(7). Но она не очень хорошо подходит для первоначального знакомства.
Разрешения процессов (process capabilities)
Права обычных пользователей очень ограничены, в то время как права пользователя “root” очень обширны. Хотя процессам, запущенным под «root», часто не требуются все полномочия root.
Для уменьшения полномочий пользователя “root” разрешения POSIX (POSIX capabilities) предоставляют способ ограничить группы привилегированных системных операций, которые разрешено выполнять процессу и его потомками. По сути, они делят все «root»-права на набор отдельных привилегий. Идея capabilities была описана в 1997 году в черновике POSIX 1003.1e.
В Linux каждый процесс (задача) имеет пять 64-битных чисел (наборов), содержащих биты разрешений (до Linux 2.6.25 они были 32-битными), которые можно посмотреть в .
Эти числа (здесь показаны в шестнадцатеричной системе счисления) представляют собой битовые карты, в которых представлены наборы разрешений. Вот их полные имена:
- Inheritable (наследуемые) — разрешения, которые могут наследовать потомки
- Permitted (доступные) — разрешения, которые могут использоваться задачей
- Effective (текущие, эффективные) — текущие действующие разрешения
- Bounding (ограничивающий набор) — до Linux 2.6.25 ограничивающий набор был общесистемным атрибутом, общим для всех потоков, предназначенным для описания набора, за пределы которого разрешения расширяться не могут. В настоящее время это набор для каждой задачи и является лишь частью логики execve, подробности далее.
- Ambient (наружные, начиная с Linux 4.3) — добавлены, чтобы легче предоставлять разрешения не-root пользователю, без использования setuid или файловых разрешений (подробности позже).
Полный человекочитаемый список полномочий, определенных на данный момент, можно найти в актуальной man-странице capabilities(7) (приведенный здесь список только для справки).
Кроме того, есть библиотека libcap для упрощения управления и проверки полномочий. В дополнение к API библиотеки в пакет входит утилита capsh, которая, помимо прочего, позволяет показать свои полномочия.
Здесь есть несколько запутанных моментов:
- Current — отображает эффективные, наследуемые и доступные привилегии процесса capsh в формате cap_to_text(3). В этом формате права перечислены как группы разрешений “capability[,capability…]+(e|i|p)” , где “e” означает эффективные, “i” наследуемые и “p” доступные. Список не разделен символом “,” , как вы могли догадаться (cap_setgid+eip, cap_setuid+eip) . Запятая разделяет разрешения в одной группе действий. Фактический список групп действий затем разделяется пробелами. Другим примером с двумя группами действий будет “= cap_sys_chroot+ep cap_net_bind_service+eip” . А также следующие две группы действий “= cap_net_bind_service+e cap_net_bind_service+ip” будут кодировать то же значение, что и одна “cap_net_bind_service+eip” .
- Bounding set/Ambient set. Чтобы еще больше запутать, эти две строки содержат только список разрешений, заданных в этих наборах, разделенных пробелами. Здесь не используется формат cap_to_text, потому что он не содержит наборы доступных, эффективных и наследуемых разрешений, а только один (bounding/ambient) набор.
- Securebits: отображает флаги securebits задачи в виде десятичных / шестнадцатеричных / в формате Verilog (да, все здесь ожидают, и это совершенно ясно по 'b , что каждый системный администратор программирует собственные FPGA и ASIC ). Далее следует состояние securebits. Фактические флаги определены как SECBIT_* в securebits.h, а также описаны в capabilities(7).
- Этой утилите не хватает отображения информации “NoNewPrivs”, которую можно посмотреть в . Она упоминается только в prctl(2), хотя и влияет напрямую на права при использовании вместе с файловыми разрешениями (более подробно далее). NoNewPrivs описывается следующим образом: “При значении no_new_privs , равном 1, execve(2) обещает не предоставлять привилегий на то, что не могло бы быть сделано без вызова execve(2) (например, обработка битов set-user-ID , set-group-ID и отключение обработки файловых разрешений). После установки атрибут no_new_privs не может быть сброшен. Значение этого атрибута наследуется потомками, созданными через fork(2) и clone(2), и сохраняется через execve(2).”. Kubernetes устанавливает этот флаг в 1, когда allowPrivilegeEscalation имеет значение false в pod securityContext.
При запуске нового процесса через execve(2), полномочия для дочернего процесса преобразуются с использованием формулы, указанной в capabilities(7):
Эти правила описывают действия, выполняемые для каждого бита во всех наборах разрешений (ambient/permitted/effective/inheritable/bounding). Используется стандартный синтаксис языка Си (& — для логического И, | — для логического ИЛИ). P’ — это дочерний процесс. P — текущий процесс, вызывающий execve(2). F — это, так называемые, “файловые разрешения” у файла, запущенного через execve.
Кроме того, процесс может программно изменить свои наследуемые, доступные и эффективные наборы с помощью libcap в любое время в соответствии со следующими правилами:
- Если вызывающая сторона не имеет CAP_SETPCAP , новый наследуемый набор должен быть подмножеством P(наследуемый) & P(доступный)
- (с Linux 2.6.25) Новый наследуемый набор должен быть подмножеством P(наследуемый) & P(ограничивающий)
- Новый доступный набор должен быть подмножеством P(доступный)
- Новый эффективный набор должен быть подмножеством P(эффективный)
Разрешения файлов (file capabilities)
Иногда пользователю с ограниченным набором прав необходимо запустить файл, который требует больше полномочий. Ранее это достигалось установкой бита setuid ( chmod + s ./executable ) в бинарном файле. Такой файл, если он принадлежит root, будет иметь полные права root при выполнении любым пользователем.
Но этот механизм предоставляет слишком много привилегий файлу, поэтому POSIX-разрешения реализовали концепцию, называемую “файловые разрешения”. Они хранятся в виде расширенного атрибута файла, называемого “security.capability”, поэтому вам нужна файловая система с поддержкой расширенных атрибутов (ext*, XFS, Raiserfs, Brtfs, overlay2, …). Для изменения этого атрибута необходимо разрешение CAP_SETFCAP (в доступном наборе разрешений процесса).
Особенные случаи и замечания
Конечно, в реальности все не так просто, и есть несколько особых случаев, описанных в man-странице capabilities(7). Наверное, самыми важными из них являются:
- Бит setuid и файловые разрешения игнорируются, если установлен NoNewPrivs или файловая система смонтирована с nosuid или процесс, вызывающий execve трассируется ptrace. Файловые разрешения также игнорируются, когда ядро загружается с опцией no_file_caps .
- “Глупый” файл (capability-dumb) — это бинарный файл, преобразованный из setuid-файла в файл с файловыми разрешениями, но без изменения его исходного кода. Такие файлы часто получаются путем установки на них разрешений +ep, например “setcap cap_net_bind_service+ep ./binary” . Важной частью является “е” — эффективный. После execve эти разрешения добавятся как к доступным, так и к действующим, поэтому исполняемый файл будет готов использовать привилегированную операцию. Напротив, ”умный” файл (capability-smart), который использует libcap или аналогичную функциональность, может использовать cap_set_proc(3) (или capset) для установки “эффективных” или “наследуемых” битов в любой момент, если это разрешение уже находится в ”доступном” наборе. Поэтому “ setcap cap_net_bind_service+p ./binary” будет достаточно для “умного” файла, поскольку он сам сможет установить необходимые разрешения в эффективном наборе перед вызовом привилегированной операции. Смотрите пример кода.
- Файлы с setuid-root продолжают работать, предоставляя все привилегии root при запуске не root пользователем. Но если у них установлены файловые разрешения, то будут предоставлены только они. Также можно создать setuid-файл с пустым набором разрешений, что сделает его выполнение под пользователем с UID 0 без каких-либо полномочий. Есть особые случаи для пользователя root при запуске файла с setuid-root и установки различных флагов securebits (см. man).
- Ограничивающий набор (bounding set) маскирует доступные разрешения, но не наследуемые. Помните P '(доступные) = F (доступные) & P (ограничивающие). Если у потока есть разрешение в своем наследуемом наборе, которое не находится в его ограничивающем наборе, тогда он все еще может получить это разрешение в своем доступном наборе, запустив файл, который имеет разрешение в своем наследуемом наборе — P '(доступный) = P (наследуемый) & F (наследуемый).
- Выполнение программы, которая изменяет UID или GID через биты set-user-ID, set-group-ID, или выполнение программы, для которой установлены какие-либо файловые разрешения, очистит окружающий набор (ambient set). Разрешения добавляются в окружающий набор, используя PR_CAP_AMBIENT prctl. Эти разрешения уже должны присутствовать как в доступных, так и в наследуемых наборах процесса.
- Если процесс с UID, отличным от 0, выполняет execve(2), то все права, присутствующие в его доступных и действующих наборах, будут удалены.
- Если не установлен SECBIT_KEEP_CAPS (или более широкий SECBIT_NO_SETUID_FIXUP ), изменение UID с 0 на ненулевой удаляет все разрешения из наследуемого, доступного и эффективного наборов.
Если официальный контейнер nginx, ingress-nginx или ваш собственный останавливается или перезапускается с ошибкой:
bind() to 0.0.0.0:80 failed (13: Permission denied)
… это означает, что была попытка слушать порт 80 под непривилегированным (не 0) пользователем, и в наборе текущих разрешений не было CAP_NET_BIND_SERVICE . Для получения этих прав необходимо использовать xattr и установить (с помощью setcap ) для файла nginx разрешение, как минимум, cap_net_bind_service+ie . Это файловое разрешение будет объединено с унаследованным набором (заданным вместе с ограничивающим набором из pod SecurityContext/capability/add/NET_BIND_SERVICE), и также размещено в наборе доступных разрешений. В результате получится cap_net_bind_service+pie .
Это все работает до тех пор, пока securityContext/allowPrivilegeEscalation установлен в true и storage-драйвер docker/rkt (см. документацию docker) поддерживает xattrs.
Если бы nginx был умен по отношению к полномочиям, то cap_net_bind_service+i было бы достаточно. Затем он мог бы использовать libcap для расширения прав от доступного набора до эффективного. Получив в результате cap_net_bind_service+pie .
Помимо использования xattr, единственным способом получения cap_net_bind_service в не-root контейнере — это позволить Docker установить внешние разрешения (ambient capabilities). Но по состоянию на апрель 2019, это еще не реализовано.
Примеры кода
Здесь пример кода с использованием libcap для добавления CAP_NET_BIND_SERVICE в эффективный набор разрешений. Он требует наличия разрешения CAP_BIND_SERVICE+p для бинарного файла.
Как вы думаете, операционная система Linux может автоматически позаботиться сама о себе? Когда работает все нормально или вам не нужны никакие нестандартные возможности - вполне да. Но иногда может понадобиться ваше вмешательство в ее работу.
В Linux для каждой отдельной программы, при ее запуске создается процесс. Неважно запускаете программу вы вручную самостоятельно или это делает система или ядро. Например, программа инициализации, которая запускается сразу после завершения загрузки ядра тоже имеет свой процесс с идентификатором 0. Процессы в linux можно описать как контейнеры, в которых хранится вся информация о состоянии и выполнении программы. Если программа работает хорошо, то все нормально, но если она зависла или вам нужно настроить ее работу может понадобиться управление процессами в Linux.
В этой статье будет затронута обширная тема, мы рассмотрим такие возможности:
- Просмотр запущенных процессов
- Просмотр информации о процессах
- Поиск процессов в Linux
- Изменение приоритета процессов
- Завершение процессов
- Ограничение памяти доступной процессу
Я не мог не включить в статью первые пункты, но они очень просты и мы не будем разбирать их очень подробно. Но вот все остальное может показаться сложным и недостаточно описанным.
Что такое процесс?
Начнем с того, что разберемся в терминах. По сути, процесс - это каждая программа. Как я уже говорил для каждой запускаемой программы создается отдельный процесс. В рамках процесса программе выделяется процессорное время, оперативная память и другие системные ресурсы. У каждого процесса есть свой идентификатор, Proccess ID или просто PID, по ним, чаще всего и определяются процессы Linux. PID определяется неслучайно, как я уже говорил, программа инициализации получает PID 1, а каждая следующая запущенная программа - на единицу больше. Таким образом PID пользовательских программ доходит уже до нескольких тысяч.
На самом деле, процессы Linux не настолько абстрактны, какими они вам сейчас кажутся. Их вполне можно попытаться пощупать. Откройте ваш файловый менеджер, перейдите в корневой каталог, затем откройте папку /proc. Видите здесь кучу номеров? Так вот это все - PID всех запущенных процессов. В каждой из этих папок находится вся информация о процессе.
Например, посмотрим папку процесса 1. В папке есть другие под каталоги и много файлов. Файл cmdline содержит информацию о команде запуска процесса:
Поскольку у меня используется система инициализации 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. Вы можете сортировать их по любому полю, например:
Список будет отсортирован в обратном порядке, внизу значения больше, вверху - меньше. Если нужно в обратном порядке, добавьте минус:
В качестве поля для сортировки могут быть использованы приоритеты процессов 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:
Система для управления процессами использует определенные сигналы, есть сигналы, которые указывают процессу завершиться. Вот несколько основных сигналов:
- SIGTERM - попросить процесс сохранить данные и завершится
- SIGKILL - завершить процесс немедленно, без сохранения
Вообще сигналов есть несколько десятков, но мы не будем их рассматривать. Отправим сигнал SIGKILL:
Также можно воспользоваться утилитой kill:
Также можно уничтожить процесс по имени:
Ограничение процессов
Управление процессами в 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:
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 – это многопользовательская операционная система, которая использует концепцию Unix о привилегиях для обеспечения безопасности на уровне файловой системы. При работе с Linux очень важно понимать, что такое права доступа и собственности. Данная статья поможет вам разобраться в основных понятиях, связанных с привилегиями пользователей Linux.
Примечание: Чтобы узнать, как изменять привилегии, читайте это руководство.
Требования
- Базовые навыки работы с Linux.
- Сервер Linux (опционально).
Пользователи Linux
Поскольку Linux является многопользовательской системой, важно понимать, как работают пользователи и группы. Рассмотрим эти понятия подробнее.
Чтобы просмотреть всех пользователей системы, проверьте файл /etc/passwd. Каждая строка в этом файле содержит данные об отдельном пользователе, начиная с имени пользователя (перед первым символом двоеточия). Чтобы вывести содержимое файла на экран, введите:
Суперпользователь
Кроме основных двух типов пользователей в Linux существует также суперпользователь, или root. Этот пользователь может переопределять права других пользователей на файлы и ограничивать доступ. По сути, суперпользователь имеет права доступа ко всем файлам, существующим на сервере. Этот пользователь имеет право вносить общесистемные изменения, потому его безопасность очень важна для безопасности самого сервера.
Также можно настроить других пользователей для выполнения полномочий суперпользователя. Для этого нужно открыть обычному пользователю доступ к команде sudo. В повседневной работе администратора сервера рекомендуется использовать именно такой аккаунт с расширенными привилегиями, поскольку использование root на постоянной основе опасно и может разрушить систему.
Группы Linux
Группы представляют собой наборы из 0 или более пользователей. Пользователь принадлежит к группе по умолчанию, а также может быть членом какой-либо из других групп.
Чтобы просмотреть все доступные группы и списки их членов, откройте файл /etc/group.
Права собственности и доступа к файлам
В Linux каждый файл принадлежит одному пользователю и одной группе и имеет индивидуальные настройки доступа.
Для просмотра прав доступа используется команда ls. Она имеет длинный список опций (например, ls -l myfile). Чтобы просмотреть настройки доступа к файлам в текущем каталоге, запустите команду без аргументов:
Чтобы запросить содержимое каталога /etc, введите:
В первом столбце вывода указан режим доступа к файлу, второй и третий столбец содержат имя пользователя и группу, четвертый – размер файла, пятый – дату его последнего изменения, в последнем столбце указано имя файла.
В целом вывод команды ls довольно легко понять, кроме, пожалуй, первого столбца, который описывает права доступа к файлу. Он выглядит примерно так:
Чтобы понять, что значат эти буквы и дефисы, разделим содержимое столбца на его компоненты. Первую строку вышеприведённого примера можно разделить на следующие категории:
d rwx(1) rwx(2) rwx(3)
- d – поле типа файла.
- rwx(1) – права пользователя-владельца файла.
- rwx(2) – права группы-владельца.
- rwx(3) – права остальных пользователей.
Типы файлов
В Linux существует два основных типа файлов: обычные и специальные.
Обычные файлы определяются символом дефиса в поле типа. Обычные файлы – это простые файлы, в которых можно хранить данные.
Файл является специальным, если в поле типа содержится буква. Такие файлы обрабатываются операционной системой иначе, чем обычные файлы. Символ в поле типа файла указывает, к какому виду специальных файлов относится определенный файл. Самым распространённым видом специальных файлов является каталог (или директория), он определяется символом d (как в примере выше). В системе Linux существует несколько видов специальных файлов, но данная тема выходит за рамки этой статьи.
Классы доступа
Как говорилось ранее, каждый файл имеет настройки для трёх категорий (или классов) доступа:
- пользователя – владельца файла;
- группы – владельца файла (к этому классу относятся все члены группы, в которой состоит пользователь – владелец файла);
- и остальных пользователей (к этому классу относятся все пользователи, которые не принадлежат к предыдущим классам).
Такого порядка привилегий придерживаются все дистрибутивы Linux.
Виды доступа
Каждая категория имеет три вида доступа, каждый из которых обозначается отдельным символом:
- r (read) – право на чтение файла,
- w (write) – право на изменение (редактирование),
- x (execute) – право на запуск (в некоторых особых случаях вместо х может использоваться другой символ).
Если вместо символа стоит дефис, значит, данный класс не имеет соответствующего права доступа. Например:
В таком случае пользователь и группа – владельцы файла имеют все права доступа, а для остальных пользователей доступ к файлу полностью закрыт.
Теперь вы знаете, как читать права доступа к файлу.
Рассмотрим подробнее, что именно даёт каждый вид доступа.
Примечание: Чтобы обеспечить нормальный доступ к файлам и каталогам, виды доступа часто используются в сочетании друг с другом.
Право на чтение файла
Право на чтение обычного файла – это возможность просматривать его содержимое.
Право на чтение каталога позволяет пользователю просматривать имена файлов, хранящихся в нём.
Право на изменение файла
В случае с обычным файлом это право даёт пользователю возможность изменять содержимое файла или удалить его.
Если у пользователя есть право на изменение каталога, то такой пользователь может удалить каталог, изменять его содержимое (то есть, создавать, переименовывать или удалять файлы в нём) и содержимое хранящихся в нём файлов.
Право на запуск
Имея такое право, пользователь может запускать обычный файл, но для этого ему также нужны права на чтение данного файла. Права на запуск нужно устанавливать для исполняемых программ и сценариев оболочки.
Если у пользователя есть право на запуск каталога, то он может читать такой каталог, а также получить доступ к его метаданным о хранящихся файлах.
Примеры привилегий
Теперь рассмотрим несколько полезных общих примеров прав доступа к файлу.
Как видите, пользователь-владелец файла, как правило, обладает всеми правами на файл (или, по крайней мере, имеет больше прав, чем остальные классы). Из соображений безопасности файлы должны быть доступны только для тех пользователей, которым необходим доступ к ним по определенной причине.
Существует множество комбинаций прав доступа, однако в каждом конкретном случае только некоторые из них полезны. К примеру, право на изменение и запуск почти всегда комбинируется с правом на чтение файла, поскольку файл сложно изменить и невозможно запустить без прав на чтение.
Примечание: Чтобы научиться изменять права доступа, читайте это руководство. В нем речь идёт об использовании команд chown, chgrp и chmod.
Заключение
Теперь вы знакомы с основными понятиями, связанными с правами доступа и собственности в окружении Linux.
Читайте также: