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

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

34

Не смотря на свою стабильность, некоторые приложения в 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
34

Комментарии

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

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

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

Не забываем и unix-way, ps в него отлично вписывается. Более того, в привычной жизни сисадмина ps aux | grep ... , а после kill использовать куда удобней, просто потому что каждый раз, как я захожу в top или htop мне постоянно приходится вспоминать, какую же клавишу жмакнуть, что бы отфильтровать вывод.
VadimAndyАктивный
05.04.2018, 16:26
Постоянная ссылка на комментарийРодительский комментарий
осваиваем функционал htop. это конечно не ps, но если приспособиться игрушка вполне дельная
[аноним]
05.12.2014, 20:56
Постоянная ссылка на комментарий
скажите, как можно осуществить одной командой (возможно через конвеер) поиск pid по названию процесса и его останов или завершение ? спасибо
[аноним]
30.11.2017, 17:02
Постоянная ссылка на комментарийРодительский комментарий
kill -19 $(pidof firefox) - остановить
kill -18 $(pidof firefox) - восcтановить
kill -9 $(pidof firefox) - убить
[аноним]
06.12.2014, 13:30
Постоянная ссылка на комментарий
Спасибо. очень помогло. открывал man ничего не понял. прочитал эту статью и все стало на свои места. Автору еще раз огромное спасибо.
[аноним]
12.12.2014, 14:00
Постоянная ссылка на комментарий
Друзья а подскажите что делать если процес не запускаеться из-за того что уже запущен
но PID его постоянно меняеться как убить такой процес?
заранее спасибо
[аноним]
20.02.2015, 20:44
Постоянная ссылка на комментарийРодительский комментарий
pkill -9 имя_процесса
[аноним]
13.01.2015, 14:13
Постоянная ссылка на комментарий
2супер_чел

killall %имя_процесса%
[аноним]
16.01.2015, 20:51
Постоянная ссылка на комментарий
Способы решения очень хорошо описаны. Плюсую.
[аноним]
05.03.2015, 19:03
Постоянная ссылка на комментарий
Спасибо, помогли разобраться!
[аноним]
20.03.2015, 19:27
Постоянная ссылка на комментарий
Все правильно. Только одно замечания Kill -9 убивает процесс напрочь (не дожидаясь корректного завершения), и пользоваться надо осторожно. Например, если запущен сервер базы данных такая команда не даст правильно сохранить процесс - база будет РАЗРУШЕНА !!!!!!!!!!!!!!!!
[аноним]
04.04.2015, 01:21
Постоянная ссылка на комментарий
kill -9 pid крутая вещь, не знал. спасибо.
[аноним]
09.06.2016, 15:28
Постоянная ссылка на комментарий
А если так завис что ни одна кнопка не работает! только шнур из розетки! как быть с этим?
[аноним]
23.07.2017, 15:36
Постоянная ссылка на комментарий
если завис наглухо, тогда alt+print+b
[аноним]
05.10.2017, 08:09
Постоянная ссылка на комментарий
Маленькая история о том, как я убил демона в себе:
ps -aux | grep 'php -f daemon_within_me.php' | awk '{print $2}' | xargs kill
[аноним]
04.04.2018, 18:40
Постоянная ссылка на комментарийРодительский комментарий
то что надо!
[аноним]
20.11.2017, 12:31
Постоянная ссылка на комментарий
А зачем людей обманывать ? Где поиск зависшего процесса ?
[аноним]
27.02.2018, 06:09
Постоянная ссылка на комментарий
Отличная статья. Спасибо.
[аноним]
08.06.2018, 01:22
Постоянная ссылка на комментарий
Странно но kill -9 <номер> - не убивает один процесс.
ps показывет его как зомби, команда kill проходит без вопросов, только процесс всё равно остаётся в системе.

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

Ваше имя:
Текст комментария: