Основные правила управления доступом
Объекты (например, файлы и процессы) имеют владельцев. Владельцы обладают обширным (но необязательно неограниченным) контролем над своими объектами.
- Вы являетесь владельцами новых объектов, создаваемых вами.
- Пользователь root с особыми правами, известный как суперпользователь, может действовать как владелец любого объекта в системе.
- Только суперпользователь может выполнять административные операции особого значения.
Владельцем файла всегда является один человек, тогда как в группу владельцев могут входить несколько пользователей. По традиции информация о группах хранилась в файле .
Вычисление средней загрузки
Средняя загрузка (Load Average, LA) — усредненная мера использования ресурсов компьютера запущенными процессами. Величина LA пропорциональна числу процессоров в системе и на ненагруженной системе колеблется от нуля до значения, равного числу процессоров. Высокие значения LA (10*число ядер и более) говорят о чрезмерной нагрузке на систему и потенциальных проблемах с производительностью.
В классическом Unix LA имеет смысл среднего количества процессов в очереди на исполнение + количества выполняемых процессов за единицу времени. Т.е. LA == 1 означает, что в системе считается один процесс, LA > 1 определяет сколько процессов не смогли стартовать, поскольку им не хватило кванта времени, а LA < 1 означает, что в системе есть незагруженные ядра.
В Linux к к количеству процессов добавили ещё и процессы, ожидающих ресурсы. Теперь на рост LA значительно влияют проблемы ввода/вывода, такие как недостаточная пропускная способность сети или медленные диски.
LA усредняется по следующей формуле LAt+1=(LAcur+LAt)/2. Где LAt+1 — отображаемое значение в момент t+1, LAcur — текущее измеренное значение, LAt — значение отображавшееся в момент t. Таким образом сглаживаются пики и после резкого падения нагрузки значение LA будет медленно снижаться, а кратковременный пик нагрузки будет отображен половинной величиной LA.
Как изменить права доступа к файлам и папкам
Команда, которую мы должны использовать для выполнения этой задачи, — это chmod, это будет инструмент, с помощью которого мы сможем добавлять или удалять разрешения как для файла, так и для существующей папки в файловой системе нашей операционной системы. Чтобы выполнить эту настройку с помощью chmod, мы можем сделать это двумя разными способами, используя буквы, которые более «человеческие», но более длинные, а также числа в «восьмеричном» формате, что намного быстрее. Эта последняя форма является нашей любимой из-за ее скорости, хотя возможно, что поначалу вам больше нравится использовать буквы, потому что она гораздо лучше понимается.
Буквы
Если мы собираемся использовать буквы для добавления или удаления разрешений для папки или файла, мы должны учитывать роли, символы и разрешения.
Есть три типа ролей:
- u: пользователь
- г: группа
- или: другие
- а: все (все), если вам нужно применить одно и то же разрешение к пользователю, группам и другим пользователям, используйте «а» для экономии времени.
Два типа символов:
- +: добавить разрешения
- -: удалить разрешения
- =: указывает набор разрешений.
Три вида разрешений:
- r: чтение
- w: письмо
- x: выполнение
Далее мы предлагаем вам серию примеров, чтобы вы могли понять, о чем мы говорим:
Предоставьте полные права на чтение, запись и выполнение всем ролям, как пользователю, так и группе и другим:
Удалите разрешения на чтение, запись и выполнение у других пользователей:
В конце концов, все заключается в объединении ролей, символов и разрешений в зависимости от наших потребностей.
Восьмеричный с использованием чисел
CHMOD Команда также совместима с другой номенклатурой, которую мы собираемся научить вас, и которая основана на восьмеричной системе счисления.
Представьте, что разрешения владельца (rwx) обозначены 0 и 1. То есть, если, например, мы хотим предоставить разрешения только на чтение и запись (а не на выполнение), это будет: 110. Если мы хотим только разрешение на чтение, это будет быть: 100.
Поэтому с учетом всех имеющихся возможностей получаем следующие значения:
- 0 0 0:0
- 0 0 1:1
- 0 1 0:2
- 0 1 1:3
- 1 0 0:4
- 1 0 1:5
- 1 1 0:6
- 1 1 1:7
То есть это то, что можно экстраполировать как на пользователя, группу, так и на других.
Формат команды будет следующим:
Где x будет изменен на число в зависимости от назначенных разрешений.
Например, если мы хотим предоставить владельцу полные разрешения и оставить две другие роли (группу и другие) без каких-либо разрешений, команда будет выглядеть так:
Если мы хотим предоставить разрешения на чтение и запись для всех ролей, это будет:
С помощью этих двух простых способов мы можем установить права доступа к файлам и папкам на нашем компьютере с Linux. Кроме того, у нас под рукой будет команда ls -l для получения информации в реальном времени о файлах и папках в системе. Мы рекомендуем вам посетить официальное руководство chmod для Linux, для этого мы выполним на консоли следующее:
Мы также рекомендуем изучить команды getfacl и setfacl, чтобы настроить более продвинутые списки управления доступом в Linux, и не только использовать пользователей, группы и другие, это позволит нам повысить степень детализации, хотя он явно намного более продвинутый, чем популярный chmod. В общем, если вы хорошо организовываете пользователей и группы, вам не нужно использовать эти списки управления доступом.
Удаление завершенного процесса из таблицы процессов
После завершения процесса его остается занят — это состояние процесса называется «зомби». Чтобы освободить родительский процесс должен дождаться завершения дочернего и очистить таблицу процессов. Это достигается вызовом:
Вызов эквивалентен
ждет завершения дочернего процесса и возвращает его . Код завершения и обстоятельства завершения заносятся в переменную status. Дополнительно, поведением можно управлять через параметр options.
- pid < -1 — ожидание завершения дочернего процесса из группы с pgid==-pid
- pid == -1 — ожидание завершения любого дочернего процесса
- pid == 0 — ожидание завершения дочернего процесса из группы, pgid которой совпадает с pgid текущего процесса
- pid > 0 — ожидание завершения любого дочернего процесса с указанным pid
Опция WNOHANG — означает неблокирующую проверку завершившихся дочерних процессов.
Статус завершения проверяется макросами:
Непрерывный процесс
Теперь нам нужно добиться того чтобы наш скрипт работал постоянно (а не выключался после запуска), для этого нам достаточно написать бесконечный цикл, к примеру вот так:
Если мы запустим этот скрипт, у нас действительно процесс будет запущен постоянно, но при этом мы получим почти 100% загрузку процессора, т.е. итерации цикла будут выполняться постоянно со 100% скоростью. Чтобы этого избежать нагрузку процессора, но при этом получать отклик необходимо по окончании каждой итерации цикла останавливать скрипт на некоторое количество времени. Для этого можно использовать функции «sleep» или «usleep», при «sleep» указывается время в секундах, а при «usleep» время в микросекундах, т.е. «sleep(2) = usleep(2000000)». Переделаем наш скрипт:
Здесь «usleep» будет означать, время отклика ваше программы на внешние раздражители (сигналы, сокеты и прочее).Теперь вместо почти 100% загруженности получим почти 0% загруженность процессора при простаивании процесса. Вероятно программа, которая работает в фоне будет не просто выполняться в бесконечном цикле, а ждать поступления определённого события (сигналы, таймер, поступление данных на канал или сокет, изменения в файлах и прочее), здесь же скрипт предоставлен в качестве примера.
Находим PID зависшего процесса
Каждый процесс в Linux имеет свой идентификатор, называемый PID. Перед тем, как выполнить остановку процесса, нужно определить его PID. Для этого воспользуемся командами ps и grep. Команда ps предназначена для вывода списка активных процессов в системе и информации о них. Команда grep запускается одновременно с ps (в канале) и будет выполнять поиск по результатам команды ps. Вывести список всех процессов можно, выполнив в командной строке:
Но, как правило, список очень большой и найти процесс, который мы хотим «убить», бывает не так просто. Здесь на помощь приходит команда grep. Например, чтобы найти информацию о процессе с именем gcalctool выполните команду:
Команда grep выполнит поиск по результатам команды ps и на экран будут выведены только те строки, которые содержат строку (слово) gcalctool. Здесь есть одна интересная деталь, например, если у вас не запущено приложение gcalctool, то после выполнения ps axu | grep gcalctool вы получите:
То есть мы получили сам процесс grep, так как в качестве параметра команде мы указали слово gcalctool, и grep нашел сам себя в выводе команды ps.
Если процесс gcalctool запущен, то мы получим:
Здесь нас интересует строка: «yuriy 25609 7.6 0.4 500840 17964 ? Sl 10:20 0:00 gcalctool». Число 25609 и есть идентификатор (PID) процесса gcalctool.
Есть еще один более простой способ узнать PID процесса — это команда pidof, которая принимает в качестве параметра название процесса и выводит его PID. Пример выполнения команды pidof:
Просмотр запущенных процессов в Linux
top
Чтобы посмотреть, какие процессы запущены на вашем сервере, нужно запустить команду :
В верхней части подборки приведена статистика по системе, в том числе сведения о нагрузке и общем количестве задач.
Вы можете легко увидеть, что в системе запущен 1 процесс, а 55 процессов находятся в режиме сна (т. е. не активны/не используют ресурсы ЦП).
В нижней части отображаются запущенные процессы и статистика их использования.
htop
В репозиториях доступна улучшенная версия , которая называется . Установите ее с помощью следующей команды:
Если мы запустим команду , мы увидим отображение информации в более удобном формате:
Вы можете здесь.
Ядро и системные вызовы
Какими бы умными они ни были, компьютерные программы не могут делать все сами. Им нужно делать запросы, чтобы за них выполнялись определенные функции. Эти запросы поступают в ядро Linux. Как правило, программа вызывает библиотеку или другой программный интерфейс, а затем библиотека делает соответствующий запрос — называемый системным вызовом — к ядру.
Возможность видеть системные вызовы, выполненные программой, и их ответы может помочь вам понять внутреннюю работу программ, которые вас интересуют или которые вы написали. Это что делает Strace. Это может помочь в устранении неполадок и поиске узких мест.
Это не то же самое, что отладка приложения с помощью такого инструмента, как gdb. Программа отладки позволяет вам исследовать внутреннюю работу программы во время ее выполнения. Он позволяет вам выполнять логику вашей программы и проверять память и значения переменных. Для сравнения, strace собирает информацию о системных вызовах во время работы программы. Когда отслеживаемая программа завершается, strace выводит информацию о системном вызове в окно терминала.
Системные вызовы предоставляют всевозможные низкоуровневые функции, такие как операции чтения и записи в файлах, завершающие процессы и т. Д. Есть список из сотен системных вызовов на страница руководства по системным вызовам.
Используйте системный монитор, чтобы убить процесс в Linux
Следующий вариант – открыть утилиту System Monitor вашей операционной системы Linux. Обычно это находится в меню «Системные инструменты» и отображает список запущенных процессов на вкладке «Процессы».
Чтобы закрыть не отвечающее приложение, просто выберите его и щелкните правой кнопкой мыши. Затем у вас есть три варианта:
- Остановить процесс: это приостанавливает процесс, позволяя продолжить его позже. Это не будет работать в большинстве случаев.
- Завершение процесса: правильный способ закрыть процесс, это безопасно завершит работу приложения, удаляя временные файлы в пути.
- Процесс уничтожения: это крайний вариант, и его следует использовать только в случае сбоя конечного процесса.
Лучше использовать их по порядку. Однако, если приложение регулярно зависает, вы можете использовать команду, которая, как вы знаете, работает.
Gnome System Monitor
Ну и список утилит мониторинга процессов был бы не полным без упоминания Gnome System Monitor. Это тоже самое но с графическим интерфейсом. (если у тебя KDE то там KDE System Guard).
Запустить его можно либо выбрав в меню, либо написав в терминале:
В меню можно выбрать что именно мы сейчас хотим видеть. Либо активные процессы, либо вообще все процессы, ну или процессы текущего пользователя. Также можно включить отображение дерева процессов. Отдельно есть вкладка для мониторинга использования ресурсов компьютера. Если в меню нажать «Поиск открытых файлов» то можно увидеть какие файлы какими процессами используются.
На этом, в принципе, первую часть рассказа про процессы можно заканчивать. Теперь ты знаешь что такое процессы в Linux и как их находить. Осталось только научится их контролировать. И именно этим мы займёмся в следующей статье на эту тему. А точнее разберем жизненный цикл процесса, узнаем про сигналы, приоритеты, разберемся с системными процессами и потоками ядра, а также научимся этим всем управлять. А потому не забывай возвращаться к нам.
Твой Pulse.
Процесс в Linux
Запуская программу в Unix вы создаёте «процесс», т.е. процессор начинает выполнять инструкции программы. Чтобы не запутаться в названиях «программа» и «процесс» можно представить, что «программа» это некоторая бумага с текстом приказа, а «процесс» это робот который читает приказ и выполняет его. Вполне может быть что процесс может удалить программу, которая его запустила или что процесс запустил другие программы, т.е. вызвал другие процессы.
Запуская программу в Unix процессу присваиваются некоторые параметры, а именно:
— PID — уникальный номер процесса. С помощью PID можно отправить сигнал процессу, узнать о его состоянии. PID всегда уникален и предсказать этот номер не представляется возможным. Если выполнить в консоле команду то увидим ID процесса.
* Запуская программу в консоли я использую на конце символ «&», это я делаю для того чтобы после запуска в консоли можно было запускать другие программы, т.е. не быть заблокированным своим процессом.
— Имя — имя процесса формируется из имени программы и параметры его запуска. Т.е. если выполнить в консоли «php sleep.php &» процесс будет называться «php sleep.php» если же выполнить «/usr/local/bin/php sleep.php &», то процесс будет называться «/usr/local/bin/php sleep.php». Но так бывает не всегда, при желании процесс может задать себе новое какое пожелает. Пример:
Вывод команды ps будет напоминать что-то вроде этого.
Я всё же рекомендую не использовать в имени процесса UTF-8 символы и спец символы, во избежания проблем с операционными системами Unix, без поддержки Unicode на уровне ядра.
— PPID — PID родительского процесса. У каждого процесса есть родитель, т.е. процесс который его запустил. У родительского процесса также может присутстовать родитель и так вверх по иерархии. На самом верху иерархии находится процесс «init» или «systemd», он является родоначальников всех процессов и его запускает само ядро Linux. У процесса всегда есть родитель, если родительский процесс закрывается все потомки родительского процесса «усыновляются» процессом «init» или «systemd». Если вы запускаете программу через консоль, то родителем процесса будет консольная программа, вероятно «tcsh», «bash» или «zsh». Посмотреть иерархию процессов можно так:
— UID — UID пользователя, который запустил процесс. После запуска процессу ещё присваивается владелец и группа (почти как у файла) и с правами этого пользователя процесс будет работать. К примеру если мы запустим программу от пользователя «user1» находящегося в группе «group1», то процесс сможет выполнять действия доступные пользователю «user1», и не сможет скажем зайти в папку «/root» или удалить файл, владелец которого является пользователь «user2».
— Аргументы программы — строки указанные в консоле при запуске программы после имени программы через пробел. Например если в консоли запустить программу: «php example.php a b -p1 —test=2», аргументами будут строки «a», «b», «-p1», «—test=2». В PHP аргументы программы можно найти в глобальном массиве $argv, а кол-во аргументов можно найти в глобальной переменной «$argc». Пример:
удаленный;
— удаленные вызовы процедур (Remote Procedure Calls — RPC)
RPC — разновидность технологий, которая позволяет компьютерным программам вызывать функции или процедуры в другом адресном пространстве (как правило, на удалённых компьютерах). Обычно, реализация RPC технологии включает в себя два компонента: сетевой протокол (чаще TCP и UDP, реже HTTP) для обмена в режиме клиент-сервер и язык сериализации объектов (или структур, для необъектных RPC).
— сокеты Unix
Сокеты UNIX бывают 2х типов: локальные и сетевые. При использовании локального сокета, ему присваивается UNIX-адрес и просто будет создан специальный файл (файл сокета) по заданному пути, через который смогут сообщаться любые локальные процессы путём простого чтения/записи из него. Сокеты представляют собой виртуальный объект, который существует, пока на него ссылается хотя бы один из процессов. При использовании сетевого сокета, создается абстрактный объект привязанный к слушающему порту операционной системы и сетевому интерфейсу, ему присваивается INET-адрес, который имеет адрес интерфейса и слушающего порта.
Убейте программу Linux, нажав «X»
Вы, наверное, уже пытались уйти и сделать горячий напиток. Если вы вернулись на свой компьютер и обнаружили, что приложение все еще зависло, вероятно, у него было достаточно времени, чтобы снова начать работать. Приложение, не отвечающее на запросы, обычно имеет серые кнопки или параметры, которые не работают. Вы также можете не перемещать окно приложения по экрану.
Итак, каково решение? Нажмите кнопку X в верхнем углу (слева или справа, в зависимости от графической оболочки в которой вы работаете и её настроек). Это должно остановить программу. Вы можете увидеть диалоговое окно с просьбой подождать или принудительно завершить процесс сейчас.
Если все пойдет по плану, некоторые дистрибутивы предложат вам отправить сообщение об ошибке.
Первые шаги со strace
Мы воспользуемся небольшой программой, чтобы продемонстрировать strace. Он мало что делает: открывает файл и записывает в него строку текста, и в нем нет проверки на ошибки. Это просто быстрый взлом, чтобы у нас было что использовать со strace.
# включить int main (int argc, char argv[]) {// дескриптор файла FILE * fileGeek; // открыть файл с именем «strace_demo.txt» или создать его fileGeek = fopen («strace_demo.txt», «w»); // записываем текст в файл fprintf (fileGeek, «Записываем это в файл»); // закрываем файл fclose (fileGeek); // выход из программы return (0); } // конец основного
Мы сохранили это в файле под названием «file-io.c» и скомпилировали его с помощью gcc в исполняемый файл под названием stex, названный в честь «strace example».
gcc -o stex файл-io.c
Мы вызовем strace из командной строки и передадим ему имя нашего нового исполняемого файла в качестве процесса, который мы хотим отслеживать. Мы могли так же легко отследить любую команду Linux или любой другой исполняемый файл. Мы используем нашу крошечную программу по двум причинам.
Первая причина в том, что strace многословен. Выхода может быть много. Это здорово, когда вы используете strace в гневе, но поначалу это может ошеломить. Наша крошечная программа имеет ограниченный вывод strace. Вторая причина в том, что наша программа имеет ограниченную функциональность, а исходный код краток и понятен. Это упрощает определение того, какие разделы вывода относятся к различным частям внутренней работы программы.
strace ./stex
Мы ясно видим, как системный вызов write отправляет текст «Write this to the file» в наш открытый файл и системный вызов exit_group. Это завершает все потоки в приложении и отправляет возвращаемое значение обратно в оболочку.
Управление процессами в Linux
Сердцем всех Linux и Unix-подобных операционных систем является ядро. Среди его многочисленных обязанностей — распределение системных ресурсов, таких как оперативная память и процессорное время. Они должны выполняться в режиме реального времени, чтобы все запущенные процессы получали свою справедливую долю в соответствии с приоритетом каждой задачи.
Иногда задачи могут быть заблокированы, или зациклены, или перестать отвечать по другим причинам. Или они могут продолжать работать, но сожрать слишком много процессорного времени или оперативной памяти, или вести себя таким же антисоциальным образом. Иногда задачи должны быть убиты в качестве милости для всех участников. Первый шаг. Разумеется, стоит идентифицировать рассматриваемый процесс.
Но, возможно, у вас нет никаких задач или проблем с производительностью вообще. Возможно, вам просто любопытно, какие процессы выполняются внутри вашего компьютера, и вы хотели бы заглянуть под капот. Команда удовлетворяет обеим этим требованиям. Это дает вам снимок того, что происходит внутри вашего компьютера «прямо сейчас».
достаточно гибок, чтобы дать вам именно ту информацию, которая вам нужна, именно в том формате, который вам нравится. На самом деле, у очень много вариантов. Опции, описанные здесь, будут соответствовать большинству обычных потребностей. Если вам нужно углубиться в чем мы это рассмотрели в этой статье, вы обнаружите, что наше введение облегчает восприятие справочной страницы.
Создание процесса и выполнение программы
Процесс может создать новый процесс с помощью системного вызова . Процесс, вызывающий , известен кък родительский процесс, а новый процесс называется дочерним процессом. Ядро создает дочерний процесс путем изготовления дубликата родительского
процесса. Дочерний процесс наследует копии родительских сегментов данных, стека и кучи, которые затем могут изменяться независимо от своих родительских копий. (Текст программы размещается в области памяти с пометкой «только для чтения» и совместно используется двумя процессами.)
Дочерний процесс запускается либо для выполнения другого набора функций в том же самом коде, что и у родительского процесса, либо зачастую для использования системного вызова с целью загрузки и выполнения совершенно новой программы. Вызов удаляет существующие сегменты текста, данных, стека и кучи, заменяя их новыми сегментами, основываясь на коде новой программы.
У вызова есть ряд надстроек в виде родственных функций библиотеки языка С с несколько отличающимся интерфейсом, но сходной функциональностью. У всех этих функций имена начинаются со строки . (В тех случаях, когда разница между ними неважна, мы будем для общей ссылки на эти функции использовать обозначение . И все же следует иметь в виду, что на самом деле функции по имени не существует.)
В основном глагол «выполнять» () будет употребляться для описания операций, выполняемых и ее библиотечными функциями-надстройками.