htop swp что это

Инструкция по использованию команды htop для интерактивного просмотра процессов в Linux

Лучше htop или top?

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

У обеих команд есть свои преимущества. Например, в программе htop реализован очень удобный поиск по процессам, а также их фильтрация. В команде top это не так удобно — нужно знать кнопку для вывода функции поиска.

Зато в top можно разделять область окна и выводить информацию о процессах в соответствии с разными настройками. В целом top намного более гибкая в настройке отображения процессов.

В общем, чтобы решить, какая из команд лучше именно для вас, попробуйте их обе. В данной статье будет подробно рассказано о htop, чтобы познакомиться с top обратитесь к статье «Как пользоваться командой top для наблюдения за процессами в Linux».

Как установить htop

Установите пакет с именем htop используя менеджер пакетов для вашего дистрибутива.

В Debian, Linux Mint, Ubuntu, Kali Linux и их производных выполните:

В Arch Linux, Manjaro, BlackArch и их производных выполните:

Как просмотреть все процессы в Linux

Команду htop можно запускать как с правами обычного пользователя:

Так и с привилегиями суперпользователя, для этого используйте sudo:

Права суперпользвоателя нужны только для некоторых действий: для изменения приоритета (nice) процессов, для закрытия процессов других пользователей.

Как и в случае с программой top, окно разделено на два основных раздела:

Область с информацией о системе

В самом верху показана нагрузка на каждое ядро центрального процессора (цифры от 1 до 12).

Mem — это общее количество оперативной памяти и используемая память.

Task — обобщённая статистика по процессам

Swp — уровень занятости файла подкачки (если он есть)

Load average — средняя загрузка центрального процессора

Uptime — время работы операционной системы с момента последней загрузки

Теперь перейдём к области с информацией о запущенных процессах.

Значение столбцов htop

Программа htop выводит следующие столбцы:

USER

Имя пользователя владельца процесса или ID если имя не может быть определено.

Приоритет — внутренний приоритет ядра для процесса, обычно это просто значение nice плюс двадцать. Отличается для процессов имеющих приоритет выполнения real-time.

VIRT

Размер виртуальной памяти процесса (M_SIZE).

Размер резидентного набора (text + data + stack) процесса (т.е. размер используемой физической памяти процесса, M_RESIDENT).

Размер общих страниц процесса (M_SHARE).

STATE, состояние процесса, может быть:

S для спящих (в простое)

R для запущенных

D для сна диска (бесперебойный)

Z для зомби (ожидает родитель считает его статус выхода)

T для отслеживания или приостановки (т. е. от SIGTSTP)

W для подкачки

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

Процент памяти, используемой процессом в данный момент (в зависимости от размера резидентной памяти процесса, см. M_RESIDENT выше).

TIME+

Время, измеренное в часах, указывает на то, сколько процесс провёл в пользовательском и системном времени.

Command

Полная командная строка процесса (то есть имя программы и аргументы).

Как ускорить или замедлить частоту обновления htop

Для установки времени обновления htop используйте опцию -d после которой укажите время обновления в десятой части секунд. Например, чтобы программа обновляла окно каждую 1/10 секунды:

Чтобы программа выводила новые данные раз в 5 секунд:

Как вывести процессы в виде дерева

Для вывода процессов в виде дерева используйте опцию -t:

Либо во время работы программы нажмите клавишу F5:

Как перемещаться по списку процессов в htop

Вы можете использовать курсорные клавиши (, , , ) для прокрутки списка процессов.

Также работают клавиши PgUp, PgDn для прокрутки окна.

Кнопка Home перенесёт к началу списка.

Кнопка End прокрутит список до конца.

Как в htop отсортировать по потреблению памяти. Как выбрать поле для сортировки

Нажмите клавишу F6 для выбора поля, которое вы хотите использовать для сортировки.

Для переключения к обратному порядку сортировки используйте кнопку I (Shift+i). При повторном нажатии список вновь будет отсортирован в обратном порядке.

Как свернуть ветки дерева процессов в htop

В режиме дерева процессов выберите ветку дерева, которую вы хотите свернуть и нажмите F6.

Поиск и фильтрация процессов в htop

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

При фильтрации на экран будут выводиться только процессы, соответствующие введённой строке.

Для перехода к поиску по процессам нажмите F3 или /. Для переключения между найденными процессами нажимайте F3.

Для фильтрации процессов нажмите F4 или \ начните вводить имя процесса.

Для очистки фильтра вновь нажмите F4 и затем Esc.

Как изменить приоритет процесса в htop

Для увеличения приоритета процесса (вычитание из величины nice) нажмите кнопку F7 или ]. Помните, что эту операцию может делать только суперпользователь (вы должны быть root’ом или запустить htop с sudo).

Для уменьшения приоритета процесса (прибавления к величине nice) нажмите кнопку F8 или [.

Как выбрать один или несколько процессов в htop

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

Для снятия выделения со всех процессов нажмите U (Shift+u).

Как закрыть процесс в htop

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

Как показать файлы, которые использует процесс

Если вы хотите увидеть файлы, открытые процессом, то выделите интересующий вас процесс и нажмите кнопку l (маленькая латинская L).

Чтобы эта функция работала, в системе должны быть установлена утилита lsof.

Как изменить внешний вид htop

Для изменения внешнего вида — панели с информацией о системе, выводимых столбцах и прочем, нажмите кнопку F2 или S (Shift+s).

Там вы увидите следующие вкладки:

Как указать поле для сортировки при запуске htop

С помощью опции -s можно указать столбец, по которому будут отсортированы процессы.

Например, для сортировки процессов по столбцу PERCENT_MEM (процент используемой памяти):

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

Как показать только процессы определённого пользователя

Используйте опцию -u в команде вида:

Например, для вывода процессов только пользователя mial:

Как показать только процесс с определённым номером

Для слежения только за некоторыми процессами используйте опцию -p PID,PID…. Через запятую вы можете перечислить один или более идентификаторов процессов. Только эти процессы будут показаны в окне htop.

Трассировка системных вызовов

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

Для работы этой функции у вас должна быть установлена утилита strace.

Как закрыть htop

Для выхода из программы нажмите F10 или q или Ctrl+c.

Если возможностей htop вам недостаточно, то обратитесь к статье «Как пользоваться командой top для наблюдения за процессами в Linux».

Источник

Использование команд ps, kill и nice для управления процессами в Linux

Вступление

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

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

Данное руководство затрагивает некоторые простейшие аспекты управления процессами. Для этого Linux предоставляет широчайший набор инструментов.

Данные понятия будут рассмотрены на примере сервера Ubuntu 12.04, но любой современный дистрибутив Linux будет работать таким же образом.

Как просматривать запущенные процессы в Linux

Самый простой способ узнать, какие процессы запущены на сервере в данный момент, – использовать команду top:

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

Можно увидеть, что 1 процесс запущен, а 55 процессов находятся в режиме ожидания (иначе говоря, простаивают, не используя ресурсы процессора).

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

Усовершенствованная версия команды top под названием htop доступна в хранилищах. Чтобы установить ее, используйте данную команду:

sudo apt-get install htop

Запустив команду htop, можно увидеть более удобное для пользователя отображение информации:

Как использовать ps для получения списка процессов

Команды top и htop предоставляют удобный интерфейс для просмотра запущенных процессов, аналогичный графическому диспетчеру задач.

Тем не менее, данные инструменты не всегда достаточно гибки, чтобы адекватно охватить все сценарии.

При вызове без аргументов результаты могут быть немного неполными:

ps
PID TTY TIME CMD
1017 pts/0 00:00:00 bash
1262 pts/0 00:00:00 ps

Эти данные отображают все процессы, связанные с текущим пользователем и терминальной сессией. Это имеет смысл, так как в данный момент с терминала запущены только команды bash and ps.

Чтобы получить более полную картину процессов данной системы, можно запустить следующее:

Эти параметры приказывают ps показать процессы, принадлежащие всем пользователям (вне зависимости от их терминала) в удобном формате.

Чтобы увидеть дерево, отображающее иерархические отношения, можно запустить команду с данными параметрами:

Как можно видеть, процесс kthreadd отображен как порождающий относительно процесса ksoftirqd/0 и других.

Примечание об идентификаторах процессов (PID)

В Linux и Unix-подобных системах каждому процессу присвоен идентификатор (PID). Таким образом операционная система идентифицирует и отслеживает процессы.

Быстрый способ узнать PID процесса – использовать команду pgrep:

Это запросит идентификатор процесса и вернет его.

Первый порожденный при запуске процесс под названием init получает PID «1».

Данный процесс отвечает за порождение всех остальных процессов системы. Чем позже порожден процесс, тем больше будет присвоенный ему PID.

Родительский процесс – это процесс, ответственный за порождение другого процесса. Если порождающий процесс был прекращен, то дочерние процессы также прервутся. PID родительского процесса называется PPID.

PID и PPID можно увидеть в заголовках столбцов во многих приложениях управления процессами, включая top, htop и ps.

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

Как отправлять сигналы процессам в Linux

Все процессы в Linux отвечают на сигналы.

Сигналы – способ завершить или изменить поведение программ на уровне ОС.

Как отправлять процессам сигналы при помощи PID

Наиболее распространенным способом передачи сигналов программам является команда kill.

Как и следовало ожидать, функциональность данной утилиты по умолчанию заключается в попытке завершить процесс:

Это отправит всем процессам сигнал TERM. Данный сигнал приказывает процессу завершиться. Это позволяет программе выполнять операции по очистке и завершить работу без помех.

Если программа неисправна и не завершает работу при отправке сигнала TERM, можно усилить сигнал, передав сигнал KILL:

Данный специальный сигнал отправляется не программе.

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

Читайте также:  при какой температуре можно сбивать температуру у взрослого человека

Каждый сигнал имеет ассоциированный номер, который можно передать вместо имени. К примеру, можно отправить «-15» вместо «-TERM» и «-9» вместо «-KILL».

Как использовать сигналы для других целей

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

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

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

Чтобы просмотреть список всех сигналов, которые можно отправить с kill, наберите:

Как отправлять сигналы процессам по имени

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

Команда pkill работает почти также, как kill, но она действует от имени процесса:

Команда, приведенная выше, является эквивалентом:

Чтобы послать сигнал каждому экземпляру определенного процесса, используйте команду killall:

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

Как установить приоритеты процессов

Часто возникает необходимость установить, какие процессы имеют приоритет в серверной среде.

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

Linux контролирует приоритеты с помощью значения под названием niceness.

Задачи с высоким приоритетом имеют низшее значение nice, так как они поглощают ресурсы. С другой стороны, задачи с низким приоритетом имеют высокое значение nice, так как они используют минимальное количество ресурсов.

При запуске команды top в начале статьи был выведен столбец, отмеченный как «NI». В нем указывается значение nice процесса:

top
Tasks: 56 total, 1 running, 55 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1019600k total, 324496k used, 695104k free, 8512k buffers
Swap: 0k total, 0k used, 0k free, 264812k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1635 root 20 0 17300 1200 920 R 0.3 0.1 0:00.01 top
1 root 20 0 24188 2120 1300 S 0.0 0.2 0:00.56 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.11 ksoftirqd/0

В зависимости от системы, значение nice может варьироваться от «-19/-20» (наивысший приоритет) до «19/20» (самый низкий приоритет).

Чтобы запустить программу с определенным значением nice, можно использовать команду nice:

Это работает только при запуске новой программы.

Чтобы изменить значение nice программы, которая уже выполняется, нужно использовать инструмент renice:

renice 0 PID_to_prioritize

Примечание: в то время как nice работает с именем команды, renice вызывает PID процесса.

Итоги

Управление процессами – иногда достаточно сложная для новичков тема, так как используемые инструменты отличаются от их графических эквивалентов.

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

Источник

Linux: утилита htop

Общие сведения

При запуске с настройками по умолчанию – она выглядит так:

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

Цветовые обозначения строки состояния CPU и MEM разделяются по приоритетам процессов и типам используемой памяти.

Настройка отображения

htop поддерживает отображение расширенной информации, как это делает top в виде по умолчанию:

Для настройки внешнего вида htop – жмем F2 или s:

С помощью стрелок влево-вправо – можно перемещаться между колонками.

Аналогично – для процессора:

Что бы отобразить расширенную информацию о прцоессоре и задачах (например – IOwait ) – переходим в Display options :

и с помощью пробела добавляем Detailed CPU time :

Настройка отображаемых колонок, например – добавить вывод IO_RATE :

С помощью F7/F8 перемещаеем на желаемую позицию.

Выходим по F10 и смотрим:

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

Значения цветов в htop

Для MEM – следующие:

При расширенном отображении информации о CPU применяются следующие цвета:

Информация о процессоре

При отображении раширенной информации о CPU htop выводит:

Информация о процессах

Дополнительные возможности

Отобразить дерево процессов – F5 или t:

Отправить сигнал процессу – F9 или k:

Выделить (или – “установить тег”) процесс – пробел:

Можно выделить несколько процессов, и затем отправить, например, сигнал SIGKILL сразу всем:

“Следить” за процессом – F.

Выбрать вручную колонку для сортировки – F6.

Запустить lsof и отобразить все открытые процессом файлы – l:

Запустить strace и отобразить все системные вызовы процесса – s.

Запустить ltrace и отобразить все библиотечные вызовы процесса – L.

Отобразить все эти подсказки – F1 или h 🙂

Источник

htop и многое другое на пальцах

На протяжении долгого времени я не до конца понимал htop. Я думал, что средняя загрузка [load average] в 1.0 означает, что процессор загружен на 50%, но это не совсем так. Да и потом, почему именно 1.0?

Затем я решил во всём разобраться и написать об этом. Говорят, что лучший способ научиться новому — попытаться это объяснить.

htop на Ubuntu Server 16.04 x64

Ниже скриншот htop, который я буду рассматривать в статье.

Uptime

Uptime показывает время непрерывной работы системы. Это можно узнать и командой uptime.

Где же программа uptime это берёт? Она считывает информацию из файла /proc/uptime.

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

Как я об этом узнал? Я посмотрел какие файлы открывает uptime при запуске. Для этого, можно воспользоваться утилитой strace.

Будет много вывода, лучше сделать grep для поиска системного вызова open. Но это не совсем сработает, т.к. по умолчанию он выводит в стандартный поток ошибок (stderr). Можно перенаправить stderr в стандартный поток с помощью 2>&1.

Если можно взять это прямо из файла, то зачем нужна утилита uptime? Дело в том, что uptime форматирует вывод в читаемом виде, тогда как секунды в файле удобно использовать при написании собственных скриптов и программ.

Load average

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

А взяты они из файла /proc/loadavg. Если еще раз посмотреть на вывод strace, то можно заметить, что этот файл тоже был открыт.

Первые 3 числа измеряют среднюю загрузку системы за последние 1, 5 и 15 минут. 4-ый параметр это количество активных процессов и их общее число. Последнее число это ID последнего использованного процесса.

Когда запускается процесс, ему присваивается ID. Как правило, они идут в возрастающем порядке, за исключением случаев, когда число исчерпалось и системе приходится начинать отсчёт заново. ID 1 присваивается процессу /sbin/init, который запускается при старте.

Взглянем ещё раз на /proc/loadavg и попробуем запустить команду sleep в фоновом режиме. При запуске в фоновом режиме, можно увидеть ID процесса.

Таким образом, 1/123 означает, что 1 процесс выполняется или готов к выполнению, а всего их 123.

Когда при запуске htop, вы видите, что выполняется только один процесс, это сам процесс htop.

Если запустить sleep 30 и открыть htop, то число выполняющихся процессов всё равно будет 1. Это потому, что процесс sleep не выполняется, а «спит», т.е. находится в состоянии покоя, иными словами ждёт определённого события. Выполняющийся или активный процесс, это процесс который на данный момент обрабатывается в процессоре (CPU), либо ждёт своей очереди в процессоре.

Попробуйте запустить cat /dev/urandom > /dev/null, где генерируемые случайные байты записываются в особый файл, считывание из которого невозможно. Тогда вы увидите, что выполняющихся процессов теперь уже 2.

Так, активных процессов ровно 2 (генератор случайных чисел и утилита cat, которая читает файл /proc/loadavg), еще можно заметить что средняя загрузка возросла.

load average это средняя загрузка системы на протяжении определённого периода времени.

Число загрузки считается как сумма количества процессов, которые запущены (выполняются или находятся в ожидании запуска) и непрерываемых процессов (о видах процессов будет рассказано ниже). Т.е. это просто число процессов.

А средняя загрузка получается просто усреднённое значение за 1, 5 и 15 минут, так?

Оказывается, не всё так просто.

Говоря математическим языком, все три значения усредняют среднюю загрузку за всё время работы системы. Они устаревают экспоненциально, но с разной скоростью. Таким образом, средняя загрузка за 1 минуту это сумма 63% загрузки за последнюю минуту + 37% загрузки с момента запуска без учёта последней минуты. То же соотношение верно и для 5, 15 минут. Поэтому не совсем верно, что средняя загрузка за последнюю минуту включает активность только за последнюю минуту, но бОльшей частью за последнюю минуту.

Вернёмся к генератору случайных чисел.

Хотя это не совсем правильно, но вот как я упростил для понимания показатель средней загрузки.

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

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

Если бы процессоров было 2, то загрузка соответственно была бы 50%, т.к. можно было бы одновременно выполнять 2 процесса. Максимальная средняя загрузка (100% использования CPU) системы с двумя процессорами составляет 2.00.

Количество процессоров в системе можно узнать в левом верхнем углу htop или при помощи nproc.

Процессы

В правом верхнем углу, htop показывает общее количество процессов и сколько из них активны. Но почему там написано задания [Tasks], а не процессы?

Задание это синоним процесса. В ядре Linux процессы это и есть задания. htop использует термин задания, возможно, потому, что это название короче и экономит немного места.
В htop можно увидеть и потоки [threads]. Для переключения этой опции нужно использовать комбинацию Shift+H. Если отображается что то вроде Tasks: 23, 10 thr, то это значит они видимы.

Отображение потоков выполнения ядра [kernel threads] можно включить комбинацией Shift+K, и тогда задания будут выглядеть как Tasks: 23, 40 kthr.

ID процесса / PID

При каждом запуске процесса, ему присваивается идентификатор (ID), сокращенно PID.

Если запускать программу в фоновом режиме (&) из bash, то номер задачи[job] выводится в квадратных скобках, а рядом с ним PID процесса.

Ещё один способ, это использовать переменную $! в bash, которая хранит PID последнего процесса, запущенного в фоне.

ID процесса очень полезна. С помощью него можно узнать подробности процесса и управлять им.

Существует псевдо файловая система procfs, с помощью которой программы могут получить информацию от ядра системы путём чтения файлов. Чаще всего она монтируется в /proc/ и для пользователя выглядит как обычный каталог, который можно смотреть командами, такими как ls и cd.

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

Вся информация о процессе находится в /proc/ /.
$ ls /proc/12503

Например в /proc/ /cmdline содержится команда при помощи которой процесс запустился.

Эмм. не совсем так. Разделителем тут служит байт \0,

который можно заменить пробелом, либо переводом строки

В каталоге процесса могут быть и ссылки! Для примера, cwd ссылается на текущий рабочий каталог, а exe на запущенный исполняемый файл.

Дерево процессов

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

Если нажать F5 в htop, то можно увидеть иерархию процессов.

Тот же эффект и от флага f команды ps.

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

Ниже я написал, что происходит, если вы, к примеру, вызовите date из консоли bash.

Я предпочитаю использовать древовидную структуру в htop когда хочется увидеть все потоки.

Владелец процесса

У каждого процесса есть владелец — пользователь. У пользователей, в свою очередь, существуют численные ID.

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

Как выяснилось, id берёт эту информацию из файлов /etc/passwd и /etc/group.

Это обычные текстовые файлы, в которых ID привязаны к именам пользователей.

passwd? Но где пароли? А они на самом деле в /etc/shadow.

Если вы запустите программу, то она запустится от вашего имени, даже если вы не являетесь её владельцем. Если же вам нужно запустить её как root, то нужно использовать sudo.

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

Да, точно, это можно сделать только с привилегиями root.

Тут мы пытаемся вызвать echo от имени администратора, но при этом пишем в файл /etc/sudoers всё так же от нашего имени.

Как правило, есть 2 выхода из данной ситуации:

Допустим, вы захотели поменять свой пароль. Команда passwd вам в помощь. Она сохранит пароль в файле /etc/shadow, который мы видели выше.

Этот файл доступен для записи только для root:

Как же это возможно, что программа запускаемая от имени пользователя может записывать в защищённый файл?

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

Оказывается, это поведение можно изменить правками разрешения файла. Давайте посмотрим.

Обратите внимание на символ s. Она была добавлена при помощи sudo chmod u+s /usr/bin/passwd. И означает, что исполняемый файл будет всегда запускаться от имени владельца, в данном случае это root.

Так же это можно осуществить и для групп (g+s).

Состояния процесса

Дальше, мы будем разбираться со столбцом состояния процессов в htop, в котором, на примере, находятся символы S.

Возможные значения состояния:

Заметьте, что при запуске ps, он может ещё показывать подсостояния как Ss, R+, Ss+ и т.д.

R — Запущенные или в очереди

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

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

S — Прерываемый сон

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

Для примера можно взять утилиту sleep из coreutils. Он будет находится в состоянии сна определенное количество секунд.

Так это прерываемый сон, как же его можно прервать? С помощью сигнала.

Послать сигнал с помощью htop можно нажав клавишу F9 и выбрав нужный вид сигнала в меню.

Передача сигнала, так же известна как команда kill, потому что это на самом деле системный вызов, который может послать сигнал процессу. Существует одноимённая программа /bin/kill, которая может исполнить системномный вызов из пользовательского окружения и по умолчанию посылает сигнал TERM, который уничтожает процесс, убивает его.

Сигнал это всего лишь число. Числа сложно запомнить, поэтому их назвали именами. Их имена обычно пишут заглавными буквами и могут быть с префиксом SIG.

Часто используемые сигналы, это: INT, KILL, STOP, CONT, HUP.

Попробуем прервать спящий процесс, послав ему сигнал INT, он же SIGINT, просто 2, или сигнал прерывания с терминала.

Этот же сигнал посылается, если нажать комбинацию CTRL+C. bash пошлёт сигнал SIGINT процессу на переднем плане, точно так же, как мы это сделали вручную.

Кстати, в bash команда kill встроена, хотя во многих системах есть программа /bin/kill. Почему? Чтобы можно было «убить» процесс даже если превышен лимит на количество создаваемых процессов.

Следующие команды идентичны:

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

Возможно, вы встречали такое исключение при запуске скриптов на Python:

Но существует сигнал способный остановить процесс, не дав ему возможности на него ответить. Это сигнал KILL.

D — непрерываемый сон

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

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

Непрерываемые процессы обычно находятся в ожидании IO после page fault. Процесс не может быть прерван в это время сигналом, потому что не сможет их обработать. Если бы он мог, то снова возник бы page fault и всё бы осталось как есть.

Другими словами, это может случиться, если, например, использовать протокол сетевого доступа NFS и требуется время для чтения/записи с/на него.

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

Попробуем вызвать это состояние.

8.8.8.8 это публичный DNS от Google. Там нет NFS, но это нас не остановит.

Как же узнать, что заставляет процесс оказаться в таком состоянии? strace!

Вызовим strace для команды ps выше.

И тут мы увидим, что системный вызов mount блокирует процесс.

Z — Зомби процесс

Когда процесс заканчивает свою работу с помощью exit и у неё остаются дочерние процессы, дочерние процессы становятся в состоянии зомби.

Устанавливаем компилятор С, GNU C Compiler (GCC).

Скомпилируем и запустим программу

Посмотрим на иерархию процессов

У нас есть зомби! Когда родительский процесс завершается, зомби исчезает.

Если заменить sleep(20) инструкцией while (true), зомби исчезнет сразу.

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

У родительских процессов есть возможность узнать код завершения работы дочерних процессов (в обработчике сигналов) с помощью системного вызова wait. Если дочерний процесс спит, то родительский сперва подождёт.

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

T — Остановлен сигналом управления заданиями

Я открыл два терминала и могу посмотреть на свои процессы командой ps u.

Ниже я опущу упоминание процессов -bash и ps.

Теперь в одном из терминалов запустим cat /dev/urandom > /dev/nul. Его состояние будет R+, из чего следует что он активен.

Нажмём CTRL+Z, чтобы остановить процесс.

Сейчас, он в состоянии T. Если нужно продолжить процесс, то можно вызвать fg в первом терминале.

Есть и другой способ останова процессов, для этого нужно послать им сигнал STOP с помощью kill, а для продолжения, соответственно, сигнал CONT.

t — Остановлен отладчиком

Для начала установим отладчик GNU Debugger (gdb)

Запустим программу для прослушивания порта 1234.

Он находится в состоянии сна, потому как ждёт входящих сообщений.

Запустим отладчик и привяжем его к процессу с PID 3905.

Теперь процесс будет прослеживаться [trace] в отладчике и его состояние изменится на t.

Время обработки процесса

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

Как же возможно, что единственный процессор может одновременно выполнять несколько заданий?

Каждый процесс выполняется определённый интервал времени, при котором другие приостановлены, затем выполняется следующий процесс и т.д.

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

Любезность и приоритет процессов

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

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

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

Из того, что я прочёл на StackOverflow и других сайтах, следует что увеличение любезности процесса на 1 ведёт к уступке 10% времени работы процессора.

Приоритет (PRI) же в свою очередь это параметр приоритета в пространстве ядра. Приоритет варьируется от 0 до 139. Приоритеты от 0 до 99 зарезервированы для процессов реального времени, а выше, т.е от 100 до 139, для пользовательских.

Можно изменить любезность процесса, и тогда, возможно, ядро примет это к сведению, но сам приоритет менять нельзя.

Соотношение любезности и приоритета следующее: PR = 20 + NI.
Таким образом область определения PR = 20 + (-20 to +19) лежит в отрезке от 100 до 139.

Можно установить любезность процесса непосредственно перед запуском.

А менять любезность во время выполнения можно с помощью renice.

Память — VIRT/RES/SHR/MEM

У процессов создаётся иллюзия, что память кроме них никто не использует. Такая иллюзия — результат работы виртуальной памяти.

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

Я хочу сказать, что из-за этого не совсем легко понять сколько же именно памяти использует процесс. А что насчёт общих [shared] библиотек и памяти, выгруженной на диск? Но, к счастью, ядро и, в частности, htop позволяют извлечь некоторую информацию чтобы понять аппетит процесса по отношению к памяти.

Читайте также:  при какой температуре плавится изомальт

VIRT/VSZ — Виртуальный образ

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

Таким образом VIRT это всё, что используется процессом.

Если приложение запрашивает 1 Гб памяти, но использует при этом только 1 Мб, то память VIRT будет отображаться всё равно как 1 Гб. Даже если оно вызовет mmap для файла весом в 1 Гб и никогда им не воспользуется, то VIRT всё равно останется 1 Гб.

В большинстве случаев этот показатель бесполезен.

RES/RSS — Резидентная память

Память RSS [resident set size] это область, которая не выгружена на диск и находится в оперативной памяти.

RES, возможно, лучше отображает реальное использование памяти процессора чем VIRT, но нужно иметь ввиду:

SHR — Разделяемая память

Объём памяти, который может быть совместно использован другими процессами.

(прим. Этот раздел не дописан до конца, как только статья обновится, я опубликую обновления)

MEM% — Использование памяти

Процент использования физической памяти. Это RES, делённый на общий объём оперативной памяти.

Если, например, RES составляет 200М и в системе установлено 8 Гб памяти, то MEM% будет 200/8192*100 = 2.4%

Процессы

Я запустил виртуальную машину с Ubuntu Server в Digital Ocean. Какие же процессы запускаются при старте системы? Необходимы ли они?

Ниже приведён анализ процессов, которые запускаются на чистой версии машины с Ubuntu Server 16.04.1 LTS x64 в Digital Ocean.

/sbin/init

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

Да, он самый. Что произойдёт, если его остановить? Ничего.

/lib/systemd/systemd-journald

systemd-journald это системная служба, которая собирает и сохраняет логи. Она создаёт структурированные, проиндексированный журналы на основе информации, полученной с разных источников и управляет ими.

Одним из основных преимуществ journald является замена обычных текстовых файлов логов специально отформатированными структурированными сообщениями. Это позволяет администраторам эффективнее работать с журналами событий.

Если нужно найти событие, лучше использовать journalctl.

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

Но что такое LVM [Logical Volume Management] (Менеджер логических томов)? Можно считать, что LVM это динамические разделы, что подразумевает создание/изменение/удаление разделов, так называемых «логических томов» из командной строки на лету, без надобности перезагрузки системы.

Звучит так, что нужен он только если пользоваться LVM.

/lib/systemd/udevd

systemd-udevd следит за событиями uevents ядра. Для каждого события, systemd-udevd запускает соответствующую инструкцию на основе правил в udev.

udev это диспетчер устройств ядра Linux. Как преемник devfsd и hotplug, udev в основном работает с устройствами в каталоге /dev.

Я не уверен о его необходимости в виртуальной среде.

/lib/systemd/timesyncd

systemd-timesyncd это системная служба которая синхронизирует локальное время с удалённым сервером NTP.

Посмотрим на открытые порты системы:

Красота! В Ubuntu 14.04 это выглядело так:

atd запускает задания, назначенные в определённое время с помощью at.

В отличии от cron, который исполняет задания с периодичностью, at единовременно выполняет задание в определённое время.

Кстати, я ни разу не использовал его до этого момента.

/usr/lib/snapd/snapd

Snappy Ubuntu Core это новое исполнение Ubuntu с обновлёнными решениями — минимальный образ сервера с теми же библиотеками что и Ubuntu, но приложения предоставляются через более простой механизм.

Разработчики нескольких дистрибутивов Linux и компании призвали к сотрудничеству для создания универсального формата «snap» для пакетов Linux, чтобы один и тот же бинарный пакет успешно и безопасно работал на любом компьютере, сервере, облаке и устройстве с Linux.

Оказывается, это упрощенный пакет deb, где нужно прикреплять все зависимости. Я никогда не пользовался snappy для установки или создания приложений на серверах.

/usr/bin/dbus-daemon

D-Bus — система межпроцессного взаимодействия, которая позволяет приложениям в операционной системе общаться друг с другом.

Я так понимаю, что это нужно только для домашнего окружения, но зачем это серверу веб приложений?

Интересно, который сейчас час и синхронизируется ли время с NTP?

Упс, возможно, это стоило оставить.

/lib/systemd/systemd-logind

systemd-logind это системная служба, управляющая авторизациями в систему.

cron — демон для запуска заданий по расписанию (Vixie Cron)
-f — не демонизировать процесс.

С помощью cron можно запускать задания с периодичностью.

Но если нет, то перед удалением, его нужно остановить и отключить

Иначе при попытке удаления командой apt remove cron, он попытается установить postfix!

Похоже, что cron нужен сервер почты для рассылки.

Rsyslogd — утилита помогающая вести логи.

Другими словами, это то, что создаёт файлы в /var/log/, такие как /var/log/auth.log для сообщений о попытках аутентификации пользователя через SSH.

Файлы конфигурации тут /etc/rsyslog.d.

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

Командой logger можно сохранить сообщение в /var/log/syslog в фоновых скриптах, таких как автозагрузчики.

Да, но у нас уже есть systemd-journald. Нужен ли ещё и rsyslogd?

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

И всё же? На всякий случай, я его оставлю.

/usr/sbin/acpid

acpid — демон для усовершенствованного интерфейса управления конфигурацией и питанием.

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

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

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

Мне удалось успешно перезагрузить машину при помощи reboot, но после halt, Digital Ocean всё ещё думал, что машина включена и мне пришлось выключить её через веб интерфейс провайдера.

Поэтому, я бы оставил эту службу.

/usr/bin/lxcfs /var/lib/lxcfs/

Lxcfs это своего рода предохраняющая файловая система. В Ubuntu 15.04 она используется по двум причинам: первое, визуализировать некоторые файлы в /proc и второе, ограничить доступ к файловой системе cgroup хоста.

В итоге, можно создавать контейнеры привычным образом с lxc-create и у контейнера будут правильные значения uptime, top, и т.д. Файловая система позволяет контейнеру больше вести себя как отдельная система, нежели без данной файловой системы.

Если не используете контейнеры LXC, то можно удалить с помощью

/usr/lib/accountservice/accounts-daemon

AccountsService предоставляет интерфейсы D-Bus для манипуляций с учётными данными пользователей. Использование интерфейсов реализовано в командах usermod(8), useradd(8) и userdel(8).

Когда я удалил D-Bus, это сломало timedatectl. Мне интересно, что сломается, когда я удалю эту службу.

/sbin/mdadm

mdadm это утилита Linux для администрирования и мониторинга программных RAID устройств.

RAID — технология виртуализации данных, которая объединяет несколько дисков в один логический элемент. У RAID есть 2 основные задачи: 1) увеличения объёма логического диска: RAID 0. Если объединить 2 диска по 500 Гб, то получится 1 Тб. 2) Избежать потерю данных если один из дисков откажет: например, RAID 1, RAID 5, RAID 6, и RAID 10.

Можно удалить с помощью:

polkit это фреймворк авторизации. Я так понимаю, что это своего рода sudo и он позволяет непривилегированным пользователям выполнять определённые команды от имени администратора, например, перезагружать систему.

Но у меня сервер. Можно удалить с помощью

Мне до сих пор интересно, что из-за него сломается.

sshd (OpenSSH Daemon) демон для ssh. С -D он не будет переведен в режим работы демона. Это позволит легче осуществлять мониторинг sshd.

/sbin/iscsid

iscsid это системная служба, запускаемая в фоновом режиме, работающая с конфигурацией iSCSI и управляющая подключениями.

Я никогда не слышал о iSCSI:

iSCSI — протокол, который базируется на TCP/IP и разработан для установления взаимодействия и управления системами хранения данных, серверами и клиентами.

agetty — Linux альтернатива getty.

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

Это позволяет войти в систему при физическом доступе к нему. В Digital Ocean, например, можно открыть консоль из браузера и подключиться к этому терминалу (кажется через VNC).

Раньше, можно было наблюдать как несколько терминалов стартовали систему (настроенных в /etc/inittab), но сейчас всё делает systemd.

Ради эксперимента, я удалил файл конфигурации, который запускает и создаёт agetty:

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

sshd: root@pts/0 означает, что была установлена SSH сессия для пользователя root в псевдотерминале (pts) №0.

bash это командная оболочка, которую я использую. Но почему перед bash стоит дефис? Пользователь Reddit под ником hirnbrot объяснил:

htop — интерактивная программа для просмотра процессов, которая изображена на скриншоте.

После

Крайняя степень:

Я так же попробовал установить программное обеспечение по своей инструкции об автоматической установке WordPress на Ubuntu Server и всё работало.

Тут nginx, PHP7 и MySQL.

За кадром

Исходный код

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

Сперва, надо найти где начать искать.

Тут видно, что uptime находится в /usr/bin/uptime и что в Ubuntu это часть пакета procps.

Затем, можно зайти на packages.ubuntu.com и найти этот пакет.

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

Дескрипторы файлов и перенаправление

Если нужно перенаправить стандартный поток ошибок (stderr) в стандартный выходной поток, нужно это делать с 2&>1 или 2>&1?

Можно запомнить положение амперсанда пониманием того, что echo нечто > файл запишет нечто в файл файл. Это тоже самое, что echo нечто 1> файл. А вот echo нечто 2> файл запишет поток ошибок в файл.

Если написать echo нечто 2> 1, то поток ошибок перенаправится в файл, с именем 1.

Если поставить перед 1 амперсанд &, то это будет означать, что 1 это не имя файла, а идентификатор потока. Поэтому правильно echo нечто 2>&1.

Цвета в PuTTY

Если некоторые элементы сверху не отображаются при использовании PuTTY, то можно это исправить так.

Командная оболочка на C

Попробуем написать очень простую командную оболочку на C, которая бы использовала системные вызовы fork/exec/wait. Программа shell.c:

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

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

Источник

Сказочный портал