Управление процессами в Linux

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

Что такое процессы

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

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

Запущенный экземпляр программы называется процессом. Процессами можно управлять. 

Как узнать, какие процессы запущены сейчас

Linux, как и большинство современных ОС, — мультизадачен. Это значит, что в Linux одновременно может работать множество процессов. 

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

top

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

1. user@bash: top
2. Tasks: 174 total, 3 running, 171 sleeping, 0 stopped
3. KiB Mem: 4050604 total, 3114428 used, 936176 free
4. Kib Swap: 2104476 total, 18132 used, 2086344 free
5. 
6. PID USER %CPU %MEM COMMAND
7. 6978 karpaff 3.0  21.2 firefox
8.  11 root 0.3   0.0 rcu_preempt
9. 6601 karpaff 2.0   2.4 kwin
10. ...

Давайте подробнее разберемся, что здесь происходит: 

  • Строка 2. Задачи (tasks) — это второе название процессов. В любой момент времени в вашей системе выполняется сразу несколько процессов. Большая часть из них системные. Многие — спят, и это нормально. «Спящие» процессы ожидают какого-то события, чтобы перейти в активное состояние. 
  • Строка 3. Это анализ оперативной памяти. Не переживайте, если используется огромное количество памяти: Linux сохраняет недавно открытые программы для повышения быстродействия. Если какому-то процессу понадобится эта память — она очистится. 
  • Строка 4. Это анализ виртуальной памяти системы. Если используется большое количество памяти — пора задуматься о ее увеличении. При наличии современного компьютера с достаточным количеством памяти такой проблемы у вас не возникнет.
  • Строки 6-10. Список наиболее ресурсоемких процессов системы в порядке убывания. Он обновляется в реальном времени — наблюдать за этим одно удовольствие. У вас перед глазами все, что происходит в вашей системе. Два важных столбца — используемая память и процент использования ЦП. Если какой-то из них находится на высоком уровне продолжительное время, стоит узнать, почему так. В столбце USER указывается пользователь, который запустил данный процесс, а PID это столбец, в котором указаны ID процессов — их уникальные идентификаторы. 

Команда top предоставляет информацию о системе в реальном времени и показывает лишь то число процессов, которые умещаются на экране. 

Есть другая команда — ps (processes, процессы). Обычно ее используют для того, чтобы увидеть список процессов в текущем терминале. Но если добавить аргумент aux, выведется полный список процессов, что гораздо полезнее.  

ps [aux]

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

Как удалить из памяти процессы, потерпевшие сбой

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

Это не страшно: процесс условного Firefox можно завершить и запустить браузер снова. Но сначала нам нужно узнать ID процесса браузера  — PID (proccess ID, идентификатор процесса). Вот, как это будет выглядеть:

1. user@bash: ps aux | grep 'firefox'
2. karpaff 6978 8.8 23.5 2344096 945452 ? Sl 08:03 49:53 /usr/lib64/firefox/firefox
3. user@bash:

Рядом с пользователем karpaff находится число — это и есть PID. Его мы будем использовать для обозначения процесса, который мы хотим закрыть. Для завершения процесса существует специальная команда — kill

kill [signal] <PID>

1. user@bash: kill 6978
2. user@bash: ps aux | grep 'firefox'
3. karpaff 6978 8.8 23.5 2344096 945452 ? Sl 08:03 49:53 /usr/lib64/firefox/firefox
4. user@bash:

Обычно простой запуск kill завершает зависший процесс. В этом случае команда отправляет параметр по умолчанию — -1. Этот сигнал указывает процессу, ему надо закрыться. Сначала всегда нужно попытаться воспользоваться этим вариантом: он короче. 

Однако это не всегда работает. В примере выше мы запускали ps, но процесс все еще работал. Ничего страшного, значит, мы просто подадим параметр -9 — это сигнал для принудительного завершения процесса. 

1. user@bash: kill -9 6978
2. user@bash: ps aux | grep 'firefox'
3. user@bash:

Примечание. Пользователь без root-прав может завершать лишь те процессы, которые он запустил. Root-пользователь может завершить любой.

Что делать, если завис рабочий стол

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

В Linux работает сразу несколько виртуальных консолей. Большую часть времени мы видим консоль номер 7 — с GUI. Но мы можем легко обратиться к другим. 

Если GUI завис, можно закрыть проблемные процессы с другой консоли. Для переключения между консолями используйте последовательность Ctrl + Alt + F<Консоль>. Например, после нажатия Ctrl + Alt + F2 вы подключитесь к консоли, с помощью которой сможете получить id приведших к сбою процессов и отключить их. А Ctrl + Alt + F7 вернет вас в GUI, чтобы проверить, все ли в порядке.

Общая тактика такая: отключать процессы до тех пор, пока рабочий стол не «отвиснет». 

Совет. Ищите процессы, которые потребляют много памяти и активно используют ЦП: обычно дело именно в них. Если это не помогает, проще перезагрузить компьютер.

Фоновые процессы и процессы переднего плана

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

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

В качестве примера приведем команду sleep. Эта команда ждет, когда пройдет заданное количество времени и завершает свою работу. 

Для отображения работающих в фоне процессов можно использовать команду jobs.

jobs

1. user@bash: sleep 5
2. user@bash: 

Если вы запустите эту программу, то заметите, что терминал ждет 5 секунд и только потом предлагает ввод снова. Но если мы сделаем то же самое, но добавим в конец & (амперсанд), мы сообщим терминалу, что программу нужно запустить на фоне.

1. user@bash: sleep 5 &
2. [1] 21634
3. user@bash:
4. user@bash:
5. [1]+ Done sleep 5

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

Мы также имеем возможность перемещать процессы между фоном и передним планом. Делается это с помощью комбинации Ctrl + Z. После нажатия этой последовательности текущий фоновый процесс останавливается и перемещается на передний план. 

Также мы можем использовать команду fg (foreground, передний план). С ее помощью мы можем перевести фоновый процесс на передний план. 

fg <job number> 

<job number> — номер процесса.

1. user@bash: sleep 15 &
2. [1] 21637
3. user@bash: sleep 10
4. (здесь вы жмете Ctrl + Z, приглашение к вводу появляется вновь)
5. user@bash: jobs
6. [1]- Running sleep 15 &
7. [2]+ Stopped sleep 10
8. user@bash: fg 2
9. [1] Done sleep 15
10. user@bash:

Совет. В Windows Ctrl + Z служит для отмены. Часто пользователи, которые перешли на Linux с Windows, используют эту комбинацию и удивляются — куда же пропала программа и почему ввод появился снова. Если вы допустили эту ошибку, не переживайте. Используйте jobs, чтобы узнать номер задачи, который был назначен программе, и верните ее на передний план с помощью fg.

Что нужно запомнить

Команды

top
Выводит данные о процессах, запущенных в системе, в реальном времени.

ps
Выводит список процессов, запущенных в системе.

kill
Завершает процесс

jobs
Выводит список текущих фоновых процессов.

fg
Переводит фоновый процесс на передний план.

Ctrl + Z
Остановить текущий процесс переднего плана и перевести его в фон.

Практически задания

1. Запустите несколько программ на рабочем столе. Затем с помощью команды ps определите их PID и завершите их.
2. Попробуйте сделать то же самое, но сначала переключитесь на другую виртуальную консоль.
3. Поиграйтесь с командой sleep и перемещением процессов между передним и фоновым планами.

codechick

СodeСhick.io - простой и эффективный способ изучения программирования.

2024 ©