Управление задачами

С последствиями многопользовательской работы в Linux мы уже знакомы. А как же тогда устроена многозадачная природа? А ведь всеми процессами можно управлять с командной строки.

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

Существует множество команд для управления процессами в командной строки. Мы рассмотрим некоторые из них:

  • ps — список запущенных процессов на компьютере
  • kill — отправка сигнала одному или нескольким процессам (обычно «убийство» процесса)
  • jobs — просмотр списка собственных задач (процессов)
  • bg — выполнение процесса в фоновом режиме
  • fg — возврат процесса из фонового режима

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

В графической оболочке X Windows есть небольшая программа xload, отображающая график загруженности компьютера. Запустим ее из командной строки.

Если мы собираемся просмотреть пример на нашей виртуальной машине, созданной ранее, то вначале нам нужно установить эту программу. Убедимся, что виртуальная машина имеет доступ в интернет, настроив ее соответствующим образом (у нее должна быть включенная сетевая карта в режиме NAT). Для установки xload менеджером пакетов yum. Он работает только с привилегиями суперпользователя, поэтому для установки xload перейдем в режим суперпользователя root с помощью команды su. Как это сделать описано в предыдущем материале. Находясь в режиме суперпользователя введем команду yum clean all чтобы очистить кэш yum, затем yum install xload для установки xload.

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

yum install xload

Подтвердим установку введя символ y и нажав Enter. Возможно будут запрошены другие подтверждения в процессе установки. На каждый запрос нужно давать положительный ответ (вводить y). Дождемся загрузки пакетов и их установки. После введем команду exit, чтобы завершить сеанс суперпользователя и вернуть себе обычные права.

Теперь запустим программу введя команду xload.

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

Еще можно заметить, что в командной строке не появилось стандартное «приглашение» для ввода новой команды. Это потому что Linux Shell ждет завершения работы программы перед тем, как ожидать новую команду. Хотя xload является графическим приложением и не ожидает ввода из командной строки, раз мы запустили программу из командной строки, она привязана к ней и выполняется в «ней».  После закрытия окна xload программа завершит работу и появится приглашения для новой команды.

Отправка программы на задний план

Теперь вновь запустим программу xload, но на этот раз в фоновом режиме, вернув командную строку к ожиданию от нас ввода новой команды. Для этого после ввода команды поставим символ амперсанда (&) обозначающий, что команда должна выполняться в фоновом режиме.

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

А как быть, если по какой-то причине мы не использовали символ & в конце команды (например, забыли)? Для этого случая тоже есть выход. Можно использовать комбинацию клавиш Ctrl + Z и процесс будет приостановлен. Для продолжения выполнения процесса в фоновом режиме можно воспользоваться командой bg. Запустим еще один процесс xload и переведем его в фоновый режим работы.

Чтобы вернуть процесс из фонового режима введем команду fg. Теперь командная строка вновь подключена к программе. Завершим программу, но не будем закрывать окно, а используем комбинацию клавиш комбинацию клавиш Ctrl + С.

Список собственных процессов и задач

У нас остался один процесс xload в фоне, тот что мы запустили дописав в конце команды символ амперсанда (&). Теперь мы хотим посмотреть, а выполняется ли он сейчас и какие еще процессы, связанные с нашим сеансом выполняются.

Для отображения списка задач мы можем воспользоваться командой jobs.

Чтобы получить список процессов нашей учетной записи используем команду ps.

«Убийство» процесса

Предположим, что запущенное приложение не отвечает («зависло»). Как тогда от него избавится? Разумеется с помощью команды kill. Попробуем завершить с ее помощью оставшийся процесс xload. Для начала нам нужно определить сам процесс и для этого мы можем воспользоваться командами jobs или ps. Команда jobs сообщает нам номер задачи, а ps уникальный номер процесса (PID).

Попробуем оба способа. Для начала определим номер задачи с помощью команды jobs. Потом выполним команду kill передав ей номер задачи, приписав перед ним знак процента (%), который значит, что мы хотим завершить задачу с указанным номером.

Окно xload исчезло, так как выполнение программы было завершено с помощью команды kill.

Теперь вновь запустим xload в фоновом режиме. Определим номер процесса (PID) с помощью команды ps и завершим процесс командой kill. На этот раз команде kill передадим номер процесса (PID). В отличии от номера задачи, перед ним не нужно вставлять никаких символов.

Процесс завершился и окно программы xload исчезло.

Чуть подробнее об убийствах процессов

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

Введя команду kill -l можно получить список сигналов, которые она поддерживает.

Некоторые из них часто используются:

  • 1SIGHUP — сигнал «вешания трубки». Программы могут слушать его и реагировать на него. Отправляется программам, запущенным в командной строке при закрытии терминала (окна командной строки).
  • 2SIGINT — сигнал прерывания. Отправляется процессам, чтобы их прервать. Программы могут слушать его и реагировать на него. Данный сигнал также можно отправить программе при помощи комбинации клавиш Ctrl + C в терминале, где она выполняется.
  • 15SIGTERM — сигнал прекращения. Отправляется процессам для прекращения их выполнения. Программы могут слушать его и реагировать на него. Этот сигнал отправляется командой kill, если при ее использовании явно не указан никакой сигнал.
  • 9SIGKILL — сигнал убийства. Программы не могут слушать данный сигнал. Он приводит к мгновенному прекращению выполнения процесса программы.

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

  1. Используя команду ps узнать номер процесса (PID), который мы желаем завершить.
  2. Использовать команду kill с указанием PID
  3. Если процесс не был завершен (проигнорировал сигнал), отправить более «сильный» сигнал (SIGKILL), чтобы его прервать.

Допустим у нас запущена программа bad_program, которую мы желаем завершить. Вначале с помощью команды ps определим ее PID. Команде ps укажем опцию x, которая выводит список всех собственных процессов, даже если они не были запущены из данного терминала. Чтобы отфильтровать список процессов по имени программы bad_programm, сцепим ее вывод с вводом программы grep, которая фильтрует строки по заданному шаблону (в данном случае bad_programm) и часто используется как фильтр в цепочке команд. Узнав PID, отправим процессу сигнал SIGTERM с помощью команды kill. В нашем примере программа bad_programm игнорирует его, поэтому завершим ее с помощью сигнала SIGKILL, который отправим с помощью команды kill:

Обычно сигнал SIGTERM не указывается, так как при вызове kill без указания данного сигнала, отправляется именно он. А вместо имени сигнала можно указать и его номер, чтобы набираемая команда стала короче. Таким образом действия из примера выше можно выполнить так:

Это конец раздела

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

Разрешения доступа к файлам

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

Если вы немного продвинуты в Windows, то можете мне возразить. Ведь в десктопных версиях Windows тоже можно создать учетные записи разных пользователей. Но это не делает Windows многопользовательской. Только серверные версии Windows являются многопользотельскими.

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

Например, если компьютер подключен к локальной сети или к интернету, разные люди могут с помощью ssh получить доступ к консоли операционной системы и работать с компьютером. Но и это не предел. Удаленный доступ можно получить и к графической среде Linux и работать с приложения, которые будут отображаться на мониторе удаленного компьютера. Несколько людей могут одновременно работать с одним и тем же компьютером. Графическая оболочка X Window в Linux поддерживает такой режим работы.

Возможность многопользовательской работы глубоко интегрирована в архитектуру операционной системы Linux. Дело в том, что Linux является подобной Unix. А теперь имеет смысл представить окружение, в котором был разработан Unix. За годы до того, как компьютеры стали «персональными», они были огромными, дорогими и «общими». Типичная компьютерная система университета состояла из огромной вычислительной машины, расположенной в одном из зданий, и множества терминалов, расположенных по всей территории университета. Каждый терминал был соединен с огромной вычислительной машиной, которая поддерживала работу многих пользователей в одно и тоже время.

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

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

  • chmod — смена разрешений доступа к файлу
  • su — временно стать «суперпользователем» root
  • sudo — выполнить команду с правами «суперпользователя»
  • chown — изменить владельца файла
  • chgrp — изменить группу владельца файла

Разрешения файлов

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

Для просмотра настроек разрешений для файла можно воспользоваться командой ls с ключом -l. На примере показан фрагмент детального вывода списка файлов из директории /etc.

детальный вывод ls

На примере мы видим, что файл tcsd.conf:

  • имеет владельца tss
  • пользователь tss может осуществлять чтение и запись файла
  • имеет группу владельца tss
  • члены группы tss не имеют доступа к файлу
  • все остальные не имеют доступа к файлу

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

Первые rwx - чтение, запись и выполнение, разрешения для владельца файла. Вторые rwx - чтение, запись и выполнение, разрешения для членов группы файла. Третьи rwx - чтение, запись и выполнение, разрешения для остальных пользователей.  Тип файла - обычный файл, d директория.

chmod

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

Можно представить настройки прав как последовательность бит. Именно так их представляет операционная система. Вот как это работает.

и так далее…

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

Рассмотрим наиболее применимые разрешения доступа для файлов. Те, что начинаются с цифры 7 используются для программ (они разрешают выполнение),  а остальные для других видов файлов.

  • 777rwxrwxrwx — отсутствуют любые ограничения, каждый может выполнять с файлом любые действия. Обычно это нежелательный вариант.
  • 755rwxr-xr-x — владелец имеет полный доступ, все остальные могут только читать и выполнять файл. Такие права устанавливаются на программы, используемые всеми пользователями.
  • 700rwx------ — только владелец имеет полный доступ к файлу. Никто другой не имеет никакого доступа к файлу. Это разрешение используется для программ, которые используются только владельцем и должны быть недоступны остальным пользователям.
  • 666rw-rw-rw- —все пользователи имеют права на чтение и запись файла.
  • 644rwxr--r-- —владелец имеет разрешения чтения и записи файла. Все остальные пользователи могут лишь читать файл. Используется для файлов с данными, к которым нужно открыть доступ на чтение для всех пользователей, но изменять данные может только владелец.
  • 600rw------- —только владелец может читать и записывать файл. Никто другой не имеет доступа к файлу. Используется для частных файлов.

Разрешения директорий

При помощи команды chmod также можно изменять разрешения доступа к директориям. Также возможно использование восьмеричной нотации для задания прав доступа, но значения атрибутов r, w и x отличаются:

  • r — позволяет просматривать содержимое директории (при условии что также задан атрибут x)
  • w — позволяет создавать, удалять и переименовывать файлы и директории внутри директории (при условии что также задан атрибут x)
  • x — позволяет войти в директорию (например, с помощью команды cd)

Для директорий наиболее часто используются следующие разрешения доступа:

  • 777rwxrwxrwx — отсутствуют любые ограничения, каждый может создавать и удалять файлы и директории внутри директории. Нежелательный вариант.
  • 755rwxr-xr-x — владелец имеет полный доступ, все остальные могут входить в директорию и просматривать ее содержимое. Такие права устанавливаются на директории, к которым нужно открыть общий доступ к другим пользователям.
  • 700rwx------ — только владелец имеет полный доступ к директории. Никто другой не имеет никакого доступа к ней и не может даже войти в нее. Используется для частных директорий, когда нужно запретить к ним любой доступ любых других пользователей.

Становимся суперпользователем

Для выполнения важных задач по администрированию системы очень часто требуются права суперпользователя root. Но постоянная работа с такими правами может негативно повлиять на нервную систему. Ведь суперпользователь имеет неограниченный доступ, а следовательно ошибок допускать нельзя. Чем больше привилегий, тем больше ответственность. Поэтому намного проще и безопаснее работать в учетной записи обычного пользователя и получать права root только, когда они необходимы. Мы ведь не хотим по ошибке разрушить свой дом имея «суперсилы» 🙂

Во многих дистрибутивах Linux существуют программы, которые могут дать временный доступ к «божественным» привилегиям root, после чего вновь можно продолжить работу в роли простого смертного не беспокоясь о последствиях.

Одна из таких программ su. Она позволяет заменить свои права на права выбранного пользователя для выполнения необходимых задач, а затем вернуть свои права обратно. Сейчас мы рассмотрим только замену своих прав, на права суперпользователя root. Чтобы получить права суперпользователя root нужно ввести команду su, после чего пароль от учетной записи root. Если пароль введен верно, то произойдет переключения прав и в конце приглашения Linux Shell знак доллара ($) изменится на «решетку» (#), которая обозначает работу под правами суперпользователя. После этого можно выполнить необходимые команды. Для завершения сеанса работы с правами root нужно набрать команду exit. Будет осуществлен возврат к привилегиям собственной учетной записи, а знак «решетки» (#) изменится на знак доллара ($).

Результат работы команд su, id и exit

В некоторых дистрибутивах Linux, в основном Ubuntu, используется другой подход. Вместо переключения в режим суперпользователя с помощью команды su, используется команда sudo. С помощью команды sudo обычные пользователи могут с правами суперпользователя выполнять необходимые им команды, введя перед sudo перед командой. После этого будет запрошен пароль, но не суперпользователя, а от текущей учетной записи. Кроме того, с помощью sudo можно дать возможность отдельным пользователям выполнять с привилегиями root только определенные команды (например дать возможность перезапускать компьютер), там самым ограничив их действия.

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

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

Sudo ls. Mikhail is not in the sudoers file.  This incident will be reported.

Смена владельца файла

Сменить владельца файла или директории можно с помощью команды chown. Чтобы сменить владельца файла нужны привилегии суперпользователя, которые можно получить с помощью команд su или sudo. Используя su, после выполнения команды chown важно не забыть выполнить команду exit, чтобы «вернуть» права суперпользователя root и продолжить работу под своими правами.

Например, мы хотим сменить владельца файла test.txt c mikhail на root. Для этого выполним следующие команды:

С помощью команды ls -la мы можем проверить, что владелец файла действительно изменен.

Пример использования команды chown

Как убедились все прошло успешно 🙂

Смена группы вдадельца

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

Например, мы хотим сменить группу владельца файла test.txt c mikhail на root. Для этого выполним следующие команды:

С помощью команды ls -la мы можем проверить, что группа файла действительно изменена.

Пример использования команды chgrp

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