- Kill: Завершение неконтролируемых процессов
- Программисты против пользователей
- Сигналы и контроль над процессами
- Вернемся к нашим SIGHUP’ам
- Применение команды kill к процессам
- Команда kill, встроенная в Bash
- Ресурсы
- Как завершить процесс в Linux. Команды kill, pkill,killall
- Синтаксис
- Примеры
- Прерывание процесса по имени. Команда pkill
- Команда killall
- Заключение
- Как убить процесс в Linux
- How to Kill a Process in Linux
- В этой статье мы покажем вам , как использовать kill , killall и pkill команды для завершения процесса в Linux.
- Сигналы убийства системы
- Завершение процессов с помощью kill команды
- Завершение процессов с помощью killall команды
- Завершение процессов с помощью pkill команды
- Вывод
- Убиваем процессы в Linux — команды ps, kill и killall
- Находим PID зависшего процесса
- «Убиваем» процесс командой kill
- Убиваем процессы командой killall
- Заключение
Kill: Завершение неконтролируемых процессов
Вы усердно боретесь с особо заковыристым приложением Линукс. Продираясь через дебри документации, запускаете команды и правите конфигурационные файлы. Все работает, и жизнь прекрасна. Как вдруг вас ошарашивает сообщение «send the process a SIGHUP» (пошлите процессу SIGHUP).
По инерции вы движетесь дальше. Что это за SIGHUP такой, и как его посылают? Вы почти уверены, что это не команда, но, на всякий случай, пробуете. Нет, не то. Перечитываем ман к приложению:
Когда получен сигнал о том, что программа зависла — SIGHUP, sshd перечитывает свой конфигурационный файл путем запуска самой себя с теми же именем и опциями, с которыми была первоначально запущена, например, /usr/sbin/sshd.
Программисты против пользователей
Сигналы и контроль над процессами
Сигналы нужны для того, чтобы взаимодействовать с процессами и демонами. Процессом называется любое активное действие. Демоны являются фоновыми (background) процессами, и до поры скрыты. Они ждут либо события, на которое они отреагируют, либо наступления времени, назначенного для выполнения некоего задания по расписанию. О наступлении этого события они узнают, получая сигнал от какого-то другого процесса. Каждая программа должна иметь в своем коде обработчик сигналов, чтобы отслеживать (перехватывать) сигналы и правильно реагировать на них. Страница руководства man signal описывает всевозможные сигналы и их действия. Сигналы посылают при помощи команды kill («убить»). Команда kill -l выводит список сигналов и их номеров.
Все демоны и процессы имеют Идентификатор Процесса (PID). PID процесса можно узнать при помощи команды ps:
В приведенном выше примере, вывод команды сильно сокращен — в вашей системе вы увидите куда больше строк и столбцов. Если какой-нибудь процесс «ворует» мощность вашего процессора или вашу память, вы увидите это в столбцах %CPU и %MEM.
Еще быстрее «зарвавшийся» процесс можно обнаружить при помощи команды top. В ней, по умолчанию, процессы, потребляющие больше ресурсов процессора, расположены в верхних строках таблицы. Мы можем немного поиграть с программой top при помощи команды yes:
$ yes carla is teh awesum
Эта команда станет повторять «carla is teh awesum» с большой скоростью, пока вы ее не остановите. Она загонит процент использования процессора в красную зону:
Интересно, что ответственность за разбазаривание мощности CPU ложится на консоль, а не на программу yes, так как yes работает внутри консоли. Если вы перейдете на «истинную» консоль (Ctrl+Alt+F2), то там увидите программу yes с большими цифрами потребления мощности процессора и использования памяти.
Существует несколько способов остановить yes. Если вы перейдете обратно в шелл, где она работает, просто нажмите Ctrl+C. Вы можете также остановить ее при помощи команды kill в другом шелле, как по PID, так и по имени:
$ kill 22236
$ killall yes
Ctrl+C посылает с клавиатуры сигнал SIGINT (2), или завершающее прерывание (terminate interrupt). kill и killall, оба, шлют по умолчанию SIGTERM (15). SIGTERM (15) может быть перехвачен и, либо игнорирован, либо интерпретирован иначе. Так что, в случае непредсказуемой работы, вы можете не добиться завершения процесса.
Применяя команду kill к родительскому процессу, вы, как правило (но не всегда), завершаете дочерний вместе с ним. Как узнать, какой процесс является дочерним? Используйте команду ps с опцией -f :
Вернемся к нашим SIGHUP’ам
# killall -HUP ‘process-name’
Как видите, можно использовать PID или имя процесса, а также имя или номер сигнала.
Зачем применять все эти команды, когда можно перезапустить процессы при помощи команды /etc/init.d/foo restart? Ведь предпочтительней контролировать сервисы с помощью их файлов init, так как такой контроль обычно включает санацию, проверку ошибок и другие функции. Если говорить честно, то главная причина использовать команду kill и сигналы состоит в том, чтобы остановить зависший или сбойный процесс как можно аккуратнее, и не прибегать к перезагрузке или завершению сеанса.
Применение команды kill к процессам
kill -STOP ‘pid’
SIGSTOP (19) останавливает процесс, не «убивая» его.
kill -CONT ‘pid’
SIGCONT (18) перезапускает остановленный процесс.
kill -KILL ‘pid’
SIGKILL (9) форсирует немедленное завершение процесса, и не производит никакой чистки.
kill -9 -1
Завершает все ваши процессы (которыми вы владеете).
SIGKILL и SIGSTOP не могут быть перехвачены, блокированы или игнорированы; остальные могут. Это ваше «большое ружье», последнее средство обороны.
Команда kill, встроенная в Bash
$ type -all kill
kill is a shell built-in
kill is /bin/kill
Маловероятно, что у вас возникнут конфликты или странное поведение программ, но на всякий случай выбирайте /bin/kill.
Не поленитесь получше познакомиться с большим миром команды kill, изучив приведенные ниже ресурсы. Это предоставит вам возможность решать возникающие проблемы путем тонкого хирургического вмешательства, не прибегая к перезагрузке системы при каждом сбое программы.
Ресурсы
- Глава 7 «Starting and Stopping Linux», Поваренная книга Линукс (the Linux Cookbook)
bash (1) — GNU Bourne-Again Shell
yes (1) — повторно выводит строку, пока не будет остановлена
signal (7) — список сигналов
ps (1) — мгновенный снимок идущих процессов
kill (1) — посылает сигнал процессу
killall (1) — «убивает» процесс по имени
pkill (1) — ищет или дает сигнал процессам на основе имени или других атрибутов
skill (1) — посылвет сигнал, либо рапортует о статусе процесса
Источник
Как завершить процесс в Linux. Команды kill, pkill,killall
В операционных системах Linux есть команда Kill, прерывающая процесс. Она позволяет серверу продолжать работу после серьезных изменений и обновлений без необходимости перезагрузки. Это одно из важнейших преимуществ Linux и одна из причин того, почему она установлена на 90% серверов в мире. Команда kill отправляет процессу специальный сигнал. Ее можно запустить различными способами, непосредственно из командной строки или из скрипта.
Синтаксис
Использование команды kill из /usr/bin предоставляет дополнительную возможность прервать процесс по его имени при помощи pkill. Стандартный синтаксис команды kill следующий:
Для команды kill существует около 60 сигналов, но основные значения следующие:
Имя сигнала | Номер сигнала | Действие |
SIGHUP | 1 | Отключить |
SIGKILL | 9 | “Убить” |
SIGTERM | 15 | Прервать |
SIGTERM используется по умолчанию. Это самый безопасный способ прерывания процесса, когда приложению отправляется запрос, который может быть обработан или проигнорирован. SIGHUP — менее безопасный способ. SIGKILL — наименее безопасный вариант, прерывание процесса без сохранения, этот сигнал не может быть проигнорирован или перехвачен.
Идентификаторы процессов
Чтобы прервать (“убить”) процесс, нам нужно знать его идентификатор (Process ID или PID). Он генерируется автоматически при запуске каждой программы и есть у каждого процесса в Linux. Первый процесс, запускаемый при загрузке Linux — init, поэтому в большинстве случаев ему присваивается идентификатор ‘1’.
Init — системный процесс, его нельзя прервать таким образом. При получении сигнала он сам решает, позволить ли себя прервать, таким образом, команда kill становится просто запросом на отключение системы. Это сделано для того, чтобы исключить случайное прерывание системных процессов.
Увидеть все запущенные процессы и соответствующие им идентификаторы можно при помощи следующей команды:
Для получения идентификатора конкретного процесса можно воспользоваться командой pidof, которой в качестве аргумента задается его имя.
Также можно сделать фильтрацию с помощью grep
Примеры
Прежде чем перейти непосредственно к исполнению команды kill, следует сделать ряд важных замечаний:
- Пользователь может прервать любой свой процесс.
- Пользователь не может прервать процесс другого пользователя..
- Суперпользователь (root) может прервать системный процесс и процесс любого пользователя.
- Пользователь не может прервать системный процесс
Чтобы “убить” процесс с указанным PID, нужно выполнить следующую команду (приведен пример для процесса mysqld из предыдущего раздела):
Будет “убит” процесс с PID=1684, то есть mysqld.
Можно использовать не только номер, но и название сигнала/ Например, для запроса на прерывание, который можно обработать или проигнорировать:
Аналогично, команда kill -SIGKILL PID эквивалентна команде # kill -9 PID
Для прерывания нескольких процессов можно указать их идентификаторы через пробел:
Прерывание процесса по имени. Команда pkill
Для прерывания процесса по имени, а не идентификатору, используется команда pkill. Нужно внимательно вводить имя процесса, так как прерывание не того процесса может привести к сбоям:
Если у процесса слишком много экземпляров и дочерних процессов, существует команда killall, которой в качестве аргумента также задается имя процесса.
Для прерывания всех экземпляров mysqld с дочерними процессами воспользуйтесь следующей командой:
Далее можно проверить состояние процесса (запущен он или нет), например:
Команда killall
Еще одна полезная команда для завершения процессов, это команда killall. Эта команда также как и pkill может завершить все процессы имеющие одно имя
А также весьма полезна бывает когда нужно завершить все процессы какого нибудь пользователя.
Заключение
Мы разобрали, как прерывать процессы в Linux и рассмотрели несколько используемых для этого команд. Эти команды следует применять с большой осторожностью, так как неосмотрительное прерывание процесса может привести к системным сбоям или потере важных данных. Для более подробной информации, различных вариантов передаваемых сигналов и других опций можно обратиться к соответствующим man-страницам.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Источник
Как убить процесс в Linux
How to Kill a Process in Linux
В этой статье мы покажем вам , как использовать kill , killall и pkill команды для завершения процесса в Linux.
Сталкивались ли вы с ситуацией, когда вы запускали приложение, и вдруг, когда вы используете приложение, оно перестает отвечать на запросы и неожиданно вылетает? Вы пытаетесь запустить приложение снова, но ничего не происходит, потому что исходный процесс приложения никогда не завершается полностью.
Ну, это случилось со всеми нами в какой-то момент, не так ли? Решение состоит в том, чтобы прекратить или убить процесс приложения. Но как?
К счастью, в Linux есть несколько утилит, которые позволяют убивать ошибочные процессы.
Основное различие между этими инструментами заключается в том, что они kill завершают процессы на основе идентификатора процесса (PID), killall а pkill команды и завершают запущенные процессы на основе их имен и других атрибутов.
Обычные пользователи могут уничтожать свои собственные процессы, но не те, которые принадлежат другим пользователям, в то время как пользователь root может уничтожать все процессы.
Сигналы убийства системы
kill , killall И pkill послать данный сигнал к определенным процессам или группам процессов. Когда сигнал не указан, каждый инструмент отправляет 15 ( TERM ).
Наиболее часто используемые сигналы:
- 1 (-HUP): перезагрузить процесс.
- 9 (-KILL): убить процесс.
- 15 (-TERM): изящно остановить процесс.
Сигналы могут быть указаны тремя различными способами:
- используя число (например, -1)
- с префиксом «SIG» (например, -SIGHUP)
- без префикса «SIG» (например, -HUP).
Используйте -l опцию для перечисления всех доступных сигналов:
Описанные ниже шаги будут работать на всех дистрибутивах Linux.
Завершение процессов с помощью kill команды
Чтобы прервать процесс kill сначала командой, вам нужно найти PID процесса. Вы можете сделать это , используя различные команды , такие как top , ps , pidof , и pgrep .
Допустим, браузер Firefox перестал отвечать на запросы, и вам нужно убить процесс браузера. Чтобы найти идентификатор процесса, используйте pidof команду:
Команда напечатает все процессы Firefox:
Как только вы узнаете, что Firefox обрабатывает PID для завершения, все они посылают TERM сигнал:
Завершение процессов с помощью killall команды
Команда killall завершает все программы, которые соответствуют указанному имени.
Используя тот же сценарий, что и раньше, вы можете убить процесс Firefox, набрав:
killall принимает несколько параметров, таких как отправка сигналов процессам, принадлежащим данному пользователю, сопоставление имен процессов с регулярными выражениями и время создания. Вы можете получить список всех опций, набрав killall (без каких-либо аргументов) на своем терминале.
Например, чтобы завершить все процессы, запущенные от имени пользователя «sara», вы должны выполнить следующую команду:
Завершение процессов с помощью pkill команды
pkill завершает процессы, которые соответствуют шаблону, указанному в командной строке:
Название процесса не должно быть точным совпадением.
С pkill его помощью вы также можете отправить сигнал процессам, которые принадлежат данному пользователю. Чтобы убить только процессы firefox, принадлежащие пользователю «sara», вы должны набрать:
Вывод
Завершение работы не отвечающих программ с помощью команд kill , killall and pkill — простая задача. Вам нужно только знать имя процесса или PID.
Источник
Убиваем процессы в Linux — команды ps, kill и killall
Под процессом мы будем понимать запущенную в системе копию программы. Например, если вы открыли три окна калькулятора (например, gcalctool), это значит, что вы запустили три процесса.
Находим PID зависшего процесса
Каждый процесс в Linux имеет свой идентификатор, называемый PID. Перед тем, как выполнить остановку процесса, нужно определить его PID. Для этого воспользуемся командами ps и grep. Команда ps предназначена для вывода списка активных процессов в системе и информации о них. Команда grep запускается одновременно с ps (в канале) и будет выполнять поиск по результатам команды ps. Вывести список всех процессов можно, выполнив в командной строке:
Но, как правило, список очень большой и найти процесс, который мы хотим «убить», бывает не так просто. Здесь на помощь приходит команда grep. Например, чтобы найти информацию о процессе с именем gcalctool выполните команду:
Команда grep выполнит поиск по результатам команды ps и на экран будут выведены только те строки, которые содержат строку (слово) gcalctool. Здесь есть одна интересная деталь, например, если у вас не запущено приложение gcalctool, то после выполнения ps axu | grep gcalctool вы получите:
То есть мы получили сам процесс grep, так как в качестве параметра команде мы указали слово gcalctool, и grep нашел сам себя в выводе команды ps.
Если процесс gcalctool запущен, то мы получим:
Здесь нас интересует строка: «yuriy 25609 7.6 0.4 500840 17964 ? Sl 10:20 0:00 gcalctool». Число 25609 и есть идентификатор (PID) процесса gcalctool.
Есть еще один более простой способ узнать PID процесса — это команда pidof, которая принимает в качестве параметра название процесса и выводит его PID. Пример выполнения команды pidof:
«Убиваем» процесс командой kill
Когда известен PID процесса, мы можем убить его командой kill. Команда kill принимает в качестве параметра PID процесса. Например, убьем процесс с номером 25609:
Вообще команда kill предназначена для посылки сигнала процессу. По умолчанию, если мы не указываем какой сигнал посылать, посылается сигнал SIGTERM (от слова termination — завершение). SIGTERM указывает процессу на то, что необходимо завершиться. Каждый сигнал имеет свой номер. SIGTERM имеет номер 15. Список всех сигналов (и их номеров), которые может послать команда kill, можно вывести, выполнив kill -l. Чтобы послать сигнал SIGKILL (он имеет номер 9) процессу 25609, выполните в командой строке:
Сигнал SIGTERM может и не остановить процесс (например, при перехвате или блокировке сигнала), SIGKILL же выполняет уничтожение процесса всегда, так как его нельзя перехватить или проигнорировать.
Убиваем процессы командой killall
Команда killall в Linux предназначена для «убийства» всех процессов, имеющих одно и то же имя. Это удобно, так как нам не нужно знать PID процесса. Например, мы хотим закрыть все процессы с именем gcalctool. Выполните в терминале:
Команда killall, также как и kill, по умолчанию шлет сигнал SIGTERM. Чтобы послать другой сигнал нужно воспользоваться опцией -s. Например:
Заключение
Некоторые процессы не удается остановить под обычным пользователем. Например, если процесс был запущен от имени пользователя root или от имени другого пользователя системы, то команды kill и killall нужно выполнять от имени суперпользователя, добавляя sudo (в Ubuntu):
Бывают ситуации, когда вы работаете в графическом интерфейсе (например, GNOME) и вам не удается открыть эмулятор терминала, чтобы остановить зависший процесс. Тогда можно переключиться на виртуальную консоль клавишами Ctrl+Alt+F1, залогиниться в ней и выполнять команды уже из нее. А потом перейти обратно, нажав Ctrl+Alt+F7.
Справку по использованию любой команды можно получить командой man:
Источник