Убиваем процессы в Linux — команды ps, kill и killall. Процессы и управление заданиями Ubuntu убить процесс по pid

Как бы там ни было, рано или поздно мы сталкиваемся с необходимостью убить подглючивший или повисший процесс в Linux . Да-да, некоторые приложения в Linux иногда виснут, несмотря на стабильность свою стабильность. Именно в этих случаях вам пригодится замечательная утилита Kill . Давайте разберемся как пользоваться этой утилитой.

Каждый процесс в Linux имеет свой идентификатор, называемый PID . Перед тем, как выполнить остановку процесса, нужно определить его PID . Суть состоит в том, что нам необходимой найти этот идентификатор, откроем например любую программу и попробуем найти ее идентификатор.

Идентификатор зависшего процесса

Для поиска нам понадобятся команды ps и grep . Команда ps — выведет для нас список активных процессов в системе и информации о них, а команда grep — будет выполнять поиск по результатам команды ps . Итак откроем терминал (ctrl+alt+t ) и посмотрим на активные процессы

ps axu

Как вы уже успели заметить список очень большой и листать его для поиска нужного нам процесса — лишняя трата времени, для этого мы и воспользуемся замечательной программой grep . Чтоб найти нужный нам процесс необходимо после ввода grep указать искомое нами приложение. На примере Viber, это выглядит так:

ps axu | grep viber pol 22685 0.0 1.9 647748 76620 ? Sl 13:01 0:04 /usr/bin/python /usr/bin/viberwrapper-indicator pol 22697 3.0 5.4 5402084 216120 ? Sl 13:01 4:52 /opt/viber/Viber pol 24068 0.0 0.0 17192 2216 pts/0 S+ 15:41 0:00 grep --color=auto viber

В первой строке запущенное приложение viberwrapper-indicator, об этом приложении можно почитать . Вторя строка непосредственно сам Viber который мы и будем сегодня «тушить», но что же за третья строка? Третий процесс это сам процесс grep , так как в качестве параметра поиска мы указали слово viber, и grep нашел сам себя в выводе команды ps .

Есть еще один более простой способ узнать PID процесса - это команда pidof , которая принимает в качестве параметра название процесса и выводит его PID. Будьте внимательны к регистру, если название процесса начинается с заглавной буквы, а вы напишете его с маленькой(или наоборот), то pidof его не нейдет

pidof Viber

Как вы уже успели заметить мне выдало 3 строки с активным приложением Viber

Завершение процесса или проще говоря «Убийство»

Теперь нам стал известен идентификатор процесса Viber и мы имеем возможность его «Убить»:

kill 22697

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

kill -9 22697

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

kill -l
Автор: Damien
Дата публикации: 8 октября 2013 года
Перевод: А. Кривошей
Дата перевода: апрель 2014 г.

Независимо от того, какую операционную систему вы используете, каждый из нас сталкивался с ситуацией, когда необходимо закрыть зависшую программу. В Linux (и в Mac) есть команда "kill", которую можно использовать для принудительного завершения работы приложений. В этом руководстве я покажу вам несколько различных способов ее использования.

Команды и сигналы Kill

Когда вы выполняете команду "kill", то фактически вы посылаете системе сигнал, чтобы заставить ее завершить некорректно ведущее себя приложение. Всего вы можете использовать до 60 сигналов, но все, что нужно знать, это SIGTERM (15) и SIGKILL (9).

Вы можете просмотреть все сигналы с помощью команды:

SIGTERM - этот сигнал запрашивает остановку работы процесса. Он может быть проигнорирован. Процессу дается время на корректное завершение. Если программа завершается корректно, значит она использовала данное время на то, чтобы сохранить свое состояние или результаты работы и освободить ресурсы. Другими словами, ее не заставляли остановиться.
SIGKILL - этот сигнал заставляет процесс прекратить работу немедленно. Программа не может проигнорировать этот сигнал. Несохраненные результаты будут потеряны.

Синтаксис использования "kill":

$ kill [сигнал или опция] PID

Сигнал по умолчанию (если он не задан) - SIGTERM. Если он не помогает, для принудительного завершения процесса можно использовать следующие варианты:

$ kill SIGKILL PID $ kill -9 PID

где флаг "-9" ссылается на сигнал SIGKILL.

Если вы не знаете точно PID приложения, просто запустите команду:

Она выведет информацию по всем запущенным программам.

Например, чтобы завершить Chrome, я введу команду:

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

$ kill -9 PID1 PID2 PID 3

PKill

Команда "pkill" позволяет использовать расширенные шаблоны регулярных выражений и другие критерии соответствия. Вместо использования PID вы теперь можете завершить приложение, введя имя его процесса. Например, для завершения работы Firefox просто введите команду:

$ pkill firefox

Так как оно соответствует шаблону регулярного выражения, вы можете также ввести имя только частично, например:

Чтобы предотвратить завершение не тех приложений, которые требовалось, можно использовать команду "pgrep -l " для вывода списка всех подходящих процессов.

Killall

Killall также использует имя процесса вместо PID и завершает все экземпляры процесса с этим именем. Например, если вы запустили несколько экземпляров Firefox, вы можете завершить их все с помощью команды:

$ killall firefox

В Gnome вы можете перезапустить Nautilus с помощью команды:

$ killall nautilus

xkill

Xkill - это графический способ завершения приложений. Когда вы введете "xkill" в терминале, курсор примет вид крестика. Все, что вам требуется, кликнуть этим крестиком в окне нужного приложения и оно немедленно завершится. Если вам понравится такой способ, можно настроить для активации xkill горячие клавиши.

Заключение

Если приложение ведет себя неправильно и вызывает зависание системы, очень заманчиво перезагрузить компьютер и начать сеанс заново. С помощью этих команд "kill" вы можете завершить зависшее приложение без опасности для работы системы. Это особенно полезно для серверов, когда вы не хотите, чтобы зависшая программа привела к выключению всего сервера.

Как бы там ни было, но некоторые приложения в Linux иногда зависают. При этом бывают ситуации, когда приложение вообще не отзывается, либо работает так медленно, что корректно завершить его работу не представляется возможным. Чтобы оперативно выйти из получившейся ситуации можно «убить» данный процесс. Для этог используеются команды kill и killall . Сейчас мы разберемся как использоваться эти команды, находить PID процесса и посылать сигнал SIGKILL.

Чтобы избежать путацины, договоримся под процессом понимать запущенную в систему программу. Например, если у вас запушено несколько окон браузера Mozilla Firefox — это значит, что запущено три процесса.

Определить PID процесса — команда pidof

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

Разумеется, PID можно определить и через top . Но в большинстве случаев количество процессов слишком велико (и динамически меняется в top), поэтому быстро и правильно определить PID не так уж и просто. Как раз для этого используется команда grep. Например, для завершения процесса браузера Google Chrome необходимо выполнить следующую команду:

ps axu | grep chrome

$ ps axu | grep chrome
itechf2 20474 2.7 1.5 938416 120136 tty2 Sl+ 11:07 0:00 /opt/google/chrome/chrome

В нашем случае 20474 и есть искомый PID. Более простой способ — использовать команду pidof , при этом необходимо указывать имя процесса. Например:

$ pidof chrome
20728 20706 20668 20647 20586 20574 20553 20508 20474

Завершить процесс в Linux — команды kill и killall

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

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

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

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

Аргумент -9 (или KILL) для команды kill следует использовать в POSIX-совместимых системах только в случае крайней необходимости. Почему? Сигнал KILL не может быть обработан процессом. Это означает, что после завершения процесса с помощью kill -9 , дочерние процессы останутся в памяти и станут «осиротевшими» (orphaned), файловая система окажется засорена временными файлами, сегменты совместно используемой памяти - активными, сокеты - зависшими, а функция atexit(3) вообще не будет выполнена. В результате есть риск столкнуться с неожиданными и сложными для отладки проблемами.

Вместо этого используйте дефолтный сигнал TERM , а KILL - только если менее проблемные сигналы окажутся неэффективными:

$ kill 6738
$ kill -INT 6738
$ kill -HUP 6738
$ kill -KILL 6738

Если даже сигналу KILL не удается завершить процесс, это означает, что процесс скорее всего завис при операции ввода-вывода или находится в каком-нибудь другом незавершаемом состоянии. Может потребоваться перезагрузка или принудительное размонтирование глючного сетевого диска.

Использование kill -KILL по умолчанию допустимо при работе с проблематичным приложением, например, старые версии Netscape частенько завершались только с помощью сигнала KILL . Однако, это редкое исключение из правила: используйте KILL для этих заранее известных приложений и только для них.

Проблемы, возникающие при завершении процессов

Последовательная отправка разных сигналов может вызвать следующие проблемы: во-первых, процессу могут потребоваться секунды, или даже десятки секунд для корректного завершения. Один продукт, которым мне приходилось пользоваться, требовал более 30 секунд для правильного завершения после получения сигнала TERM . К счастью, эта особенность была обнаружена во время тестирования, поэтому для этого случая был написан подходящий скрипт. Во-вторых, иногда бывают ситуации, когда старый процесс завершился, в то время как новый процесс занял его ID в промежутке между сигналами TERM и KILL . Особенно этому риску подвергаются системы с повышенной «текучкой» процессов и системы, где ядро назначает PID в случайном порядке, например, OpenBSD. Проверка имени процесса или его PPID не всегда помогает, так как новый процесс может быть форком того же родителя и иметь такое же имя, поэтому особо параноидальные скрипты могут также проверять время создания процесса или другие метаданные перед отправкой сигнала. Возможно эти ситуации возникают редко, но с ними стоит считаться, если приходится иметь дело с критичным процессом.

Сигналы завершения процесса

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

Сигнал HUP «подвешивает» шелл, поэтому это хороший способ очистить шелл, повисший в ожидании ввода, или закрыть SSH-сессию.

Более подробная информация о сигналах завершения процессов указана в