Убиваем процессы в Linux - команды ps, kill и killall

Не смотря на свою стабильность, некоторые приложения в Linux иногда виснут. Иногда приложения перестают отзываться или просто работают так медленно, что корректно закрыть их не получается. Один из способов «убить», запущенное приложение в Linux, это использование таких команд, как kill или killall. Рассмотрим, как использовать эти команды, находить PID процесса и посылать сигнал SIGKILL.

Под процессом мы будем понимать запущенную в системе копию программы. Например, если вы открыли три окна калькулятора (например, gcalctool), это значит, что вы запустили три процесса.

Находим PID зависшего процесса

Каждый процесс в Linux имеет свой идентификатор, называемый PID. Перед тем, как выполнить остановку процесса, нужно определить его PID. Для этого воспользуемся командами ps и grep. Команда ps предназначена для вывода списка активных процессов в системе и информации о них. Команда grep запускается одновременно с ps (в канале) и будет выполнять поиск по результатам команды ps. Вывести список всех процессов можно, выполнив в командной строке:

ps axu

Но, как правило, список очень большой и найти процесс, который мы хотим «убить», бывает не так просто. Здесь на помощь приходит команда grep. Например, чтобы найти информацию о процессе с именем gcalctool выполните команду:

ps axu | grep gcalctool

Команда grep выполнит поиск по результатам команды ps и на экран будут выведены только те строки, которые содержат строку (слово) gcalctool. Здесь есть одна интересная деталь, например, если у вас не запущено приложение gcalctool, то после выполнения ps axu | grep gcalctool вы получите:

$ ps axu | grep gcalctool
yuriy    25587  0.0  0.0  10636   884 pts/2    S+   10:20   0:00 grep --color=auto gcalctool

То есть мы получили сам процесс grep, так как в качестве параметра команде мы указали слово gcalctool, и grep нашел сам себя в выводе команды ps.

Если процесс gcalctool запущен, то мы получим:

yuriy@yuriy-NIX:~$ ps axu | grep gcalctool
yuriy    25609  7.6  0.4 500840 17964 ?        Sl   10:20   0:00 gcalctool
yuriy    25624  0.0  0.0  10640   884 pts/2    S+   10:21   0:00 grep --color=auto gcalctool

Здесь нас интересует строка: «yuriy 25609 7.6 0.4 500840 17964 ? Sl 10:20 0:00 gcalctool». Число 25609 и есть идентификатор (PID) процесса gcalctool.

Есть еще один более простой способ узнать PID процесса — это команда pidof, которая принимает в качестве параметра название процесса и выводит его PID. Пример выполнения команды pidof:

$ pidof gcalctool
25609

«Убиваем» процесс командой kill

Когда известен PID процесса, мы можем убить его командой kill. Команда kill принимает в качестве параметра PID процесса. Например, убьем процесс с номером 25609:

kill 25609

Вообще команда kill предназначена для посылки сигнала процессу. По умолчанию, если мы не указываем какой сигнал посылать, посылается сигнал SIGTERM (от слова termination — завершение). SIGTERM указывает процессу на то, что необходимо завершиться. Каждый сигнал имеет свой номер. SIGTERM имеет номер 15. Список всех сигналов (и их номеров), которые может послать команда kill, можно вывести, выполнив kill -l. Чтобы послать сигнал SIGKILL (он имеет номер 9) процессу 25609, выполните в командой строке:

kill -9 25609

Сигнал SIGTERM может и не остановить процесс (например, при перехвате или блокировке сигнала), SIGKILL же выполняет уничтожение процесса всегда, так как его нельзя перехватить или проигнорировать.

Убиваем процессы командой killall

Команда killall в Linux предназначена для «убийства» всех процессов, имеющих одно и то же имя. Это удобно, так как нам не нужно знать PID процесса. Например, мы хотим закрыть все процессы с именем gcalctool. Выполните в терминале:

killall gcalctool

Команда killall, также как и kill, по умолчанию шлет сигнал SIGTERM. Чтобы послать другой сигнал нужно воспользоваться опцией -s. Например:

killall -s 9 gcalctool

Заключение

Некоторые процессы не удается остановить под обычным пользователем. Например, если процесс был запущен от имени пользователя root или от имени другого пользователя системы, то команды kill и killall нужно выполнять от имени суперпользователя, добавляя sudo (в Ubuntu):

sudo kill 123

Бывают ситуации, когда вы работаете в графическом интерфейсе (например, GNOME) и вам не удается открыть эмулятор терминала, чтобы остановить зависший процесс. Тогда можно переключиться на виртуальную консоль клавишами Ctrl+Alt+F1, залогиниться в ней и выполнять команды уже из нее. А потом перейти обратно, нажав Ctrl+Alt+F7.

Справку по использованию любой команды можно получить командой man:

man ps
man grep
man pidof
man kill
man killall
12.09.2012yuriy27

Комментарии

Активный
13.09.2012, 09:10
спасибо, интересная статья.
03.01.2013, 22:18
у меня в xfce есть диспетчер xfce с пидами и эрсэсэсами. я его на панель в быстрый запуск вывел. зависла прога - щелк по диспетчеру , на процесс (он там буро-красным
горит) правой кнопкой - хошь завершить, хошь убить. Блямс!!!! и готово.
к чему такие сложности.....
06.01.2013, 17:28
зато в любом unix-подобном дистрибутиве будет работать такой способ
Активный
07.01.2013, 09:28
А на сервер тоже DE ставить? Работу в командной строке в Unix-подобных ОС знать необходимо.
uselessgnome
20.09.2013, 10:11
А ты попробуй завершить процесс Xorg в своем хваленом диспетчере,когда у тебя графический интерфейс Xсервера повиснет, потом расскажешь (:
Активный
22.09.2013, 21:48
Извиняй, конечно, но если все корректно поставлено, то и Xorg заврешать не придется. Кроме того, к команде предстовляется справка. И этим все сказано.
Alex
23.10.2013, 20:33
ctrl+alt+backspace ни кто еще не отменял)
Активный
02.06.2014, 15:19
Отменял, если заранее не настроено.
24.10.2013, 18:30
Во-первых, большинство графических диспетчеров задач (системных мониторов, менеджеров процессов или как там их ещё называют...) сами кушают некоторое количество ресурсов, а в ситуации, когда какой-либо процесс "завис", этот "зависший" процесс будет тормозить всё остальное, в том числе и сам диспетчер задач. По сравнению с ним, простые консольные команды практически невесомы, и должны работать почти в любой ситуации.
Во-вторых, они дают возможность завершать процессы даже если не загружен никакой графический интерфейс. Поэтому умение работать в консоли всегда полезно.
В-третьих, знание подобных консольных команд необходимо для автоматизации и настройки системы, и в некоторых случаях их использование гораздо более удобней, чем нежили использование громоздких графических утилит. Например, если вам нужно убить какой-нибудь ПЛОХОЙ_ПРОЦЕСС, то Вы просто можете ввести команду: "killall ПЛОХОЙ_ПРОЦЕСС", а если Вам приходится убивать его часто, то Вы можете создать какой-нибудь пункт запуска с этой командой, или назначить её под какую-нибудь "горячую клавишу". Таким образом, Вы сможете убить неугодный Вам процесс всего в один клик, или одно нажатие клавиши... Согласитесь, ведь это гораздо удобнее, чем каждый раз запускать диспетчер, искать в нём неугодный процесс, завершать его, а после завершать сам диспетчер...

P.S. Статья очень хорошая, автору спасибо!
Александр
17.02.2014, 14:23
А если система намертво зависла и диспетчер не возможно будет включить, тогда что делать будете?

Наверное нажмете Ctrl+Alt+F1 и будете делать как в статье написано.
lol
22.05.2015, 10:49
Латентный виндузятник
Хакер
24.07.2016, 08:47
Да потомучто есть ленивые людир а есть нормальные.Которым нравится inux
Михаил
20.09.2013, 08:03
5 баллов!
Лаконично, чётко, доступно!
И без снобизма.
Уважуха, чел!
Фёдор
13.10.2013, 13:10
Согласен, понравилась конкретика без мусора.
А диспетчер виснет вместе с убойным процессом. Толку от него мало, его даже запустить проблемно в таком случае.
Активный
02.06.2014, 16:31
Не понятно чем не угодил top/Htop? Уж что-что а pid он точно укажет.
tostus
11.10.2014, 18:53
Ммм.. безусловно, пид они покажут, и там даже SIG нужный можно отправить, но например top в не интерактивном режиме использовать уже не так удобно. Если Вам нужно определять пид где-нибудь в подстановке $(), или Вы пишите скрипт инициализации демона или еще чего, какой парсер там, ps позволяет Вам форматировать вывод и получать нужную строчку с пидом в нужном формате. Это всего лишь пример.

Не забываем и unix-way, ps в него отлично вписывается. Более того, в привычной жизни сисадмина ps aux | grep ... , а после kill использовать куда удобней, просто потому что каждый раз, как я захожу в top или htop мне постоянно приходится вспоминать, какую же клавишу жмакнуть, что бы отфильтровать вывод.
embers
05.12.2014, 20:56
скажите, как можно осуществить одной командой (возможно через конвеер) поиск pid по названию процесса и его останов или завершение ? спасибо
Ден
06.12.2014, 13:30
Спасибо. очень помогло. открывал man ничего не понял. прочитал эту статью и все стало на свои места. Автору еще раз огромное спасибо.
супер чел
12.12.2014, 14:00
Друзья а подскажите что делать если процес не запускаеться из-за того что уже запущен
но PID его постоянно меняеться как убить такой процес?
заранее спасибо
чел супер
20.02.2015, 20:44
pkill -9 имя_процесса
tester
13.01.2015, 14:13
2супер_чел

killall %имя_процесса%
Александр
16.01.2015, 20:51
Способы решения очень хорошо описаны. Плюсую.
usesa
05.03.2015, 19:03
Спасибо, помогли разобраться!
Arthur
20.03.2015, 19:27
Все правильно. Только одно замечания Kill -9 убивает процесс напрочь (не дожидаясь корректного завершения), и пользоваться надо осторожно. Например, если запущен сервер базы данных такая команда не даст правильно сохранить процесс - база будет РАЗРУШЕНА !!!!!!!!!!!!!!!!
Aleks
04.04.2015, 01:21
kill -9 pid крутая вещь, не знал. спасибо.
Денис
09.06.2016, 15:28
А если так завис что ни одна кнопка не работает! только шнур из розетки! как быть с этим?
владимир
23.07.2017, 15:36
если завис наглухо, тогда alt+print+b

Написать комментарий

Ваше имя:
Текст:
Вы не зарегистрированы: комментарий будет опубликован только после просмотра администратором сайта.