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

С последствиями многопользовательской работы в 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 завершен и готовятся уже готовы содержание раздела и тест к нему. В следующих разделах мы будем более глубоко углубляться в детали и подробности и со временем дойдем до автоматизации задач с помощи шел-скриптов 🙂

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *