Управление процессами в 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
и перемещением процессов между передним и фоновым планами.