Как удалить зависший процесс linux
Перейти к содержимому

Как удалить зависший процесс linux

  • автор:

RENOTES

Но что делать, если процесс завис? У меня чаще всего это Skype. Найдем процесс:

ps -A | grep "skype"

Для завершения процесса нужно вызвать утилиту kill с параметром «-9». В этом случае она просто убьет процесс без процедуры «завершитесь, пожалуйста» (123 — ID процесса).

sudo kill -9 123

Также можно использовать утилиту killall, когда необходимо убить дерево процессов.

sudo killall skype

Как убить процесс в Linux

Если вы новый пользователь Linux, то вам требуется знать. Как убить (завершить) процесс в Linux, используя параметры командной строки? Как я могу убить запущенный процесс на Unix?

Linux и другие Unix — подобные операционные системы поставляются с командой kill. Данная команда позволяет завершить зависшие или нежелательные процессы без необходимости выхода из системы или перезапуска сервера или ПК.

Команда kill посылает заданный сигнал, например, KILL process, указанному процессу или группе процессов. Если сигнал не указан, посылается сигнал TERM. Обратите внимание, что команда kill может быть внутренней, как часть встроенной функции оболочки. Или внешней, расположенной по адресу /bin/kill. Синтаксис остаётся аналогичным независимо от того, какая команда внутренняя или внешняя.

Возможно вам будет интересно: Как обновить openSUSE Linux

Список распространенных сигналов TERM в Linux или Unix

Linux и Unix-подобные операционные системы поддерживают стандартные сигналы завершения, они перечисленные ниже:

SIGHUP (1) — обнаружено зависание на управляющем терминале или смерть управляющего процесса. Используйте SIGHUP для перезагрузки файлов конфигурации и открытия/закрытия файлов журнала.

SIGKILL (9) — это сигнал убийства. Используйте SIGKILL в качестве последнего средства для уничтожения процесса. Он не сохранит данные и не очистит процесс.

SIGTERM (15) — сигнал завершения. Это стандартный и самый безопасный способ завершения процесса.

Команды kill и killall поддерживают более 60 сигналов. Однако большинству пользователей необходимо использовать только сигнал 9 или 15. Чтобы получить полный список сигналов, введите:

Команда Kill информация по команде

Возможно вам будет интересно: Включить SSH на Fedora

Что такое PID?

Процесс в Linux или Unix — это запущенный экземпляр программы. Например, Firefox — это запущенный процесс, если вы просматриваете Интернет. Каждый раз, когда вы запускаете браузер Firefox в системе автоматически присваивается уникальный идентификационный номер процесса (PID). PID автоматически присваивается каждому процессу при его создании в системе. Чтобы узнать PID процесса firefox или httpd, используйте следующую команду pidof:

pidof httpd
pidof apache2
pidof firefox

Или используйте комбинацию команды ps и команды grep/egrep:

ps aux | grep httpd
ps aux | grep apache2
ps aux | grep firefox

Найдите идентификатор процесса (PID) запущенной программы firefox и сервера apache2.

Возможно вам будет интересно: Как ускорить Nginx с помощью кэша Varnish на CentOS 7

Команда pgrep

Вы также можете использовать команду pgrep для поиска идентификатора процесса (PID):

pgrep process
pgrep firefox
pgrep vim

Команда PS для просмотра процессов Linux

Вы можете найти уникальный номер процесса с помощью команды PS в разделе PID

Определение процесса в Linux

Как убить процесс в Linux из командной строки

kill -[signal] PID
kill -15 PID
kill -9 PID
kill -SIGTERM PID
kill [options] -SIGTERM PID

Возможно вам будет интересно: Как подключиться к удаленной базе данных через SSH — туннель в pgAdmin4 и DBeaver

Какие разрешения Linux или Unix нужны, чтобы убить процесс?

Правила убийства процесса просты:

  1. Вы можете убить все свои собственные процессы.
  2. Толькопользователь root может убить процесс системного уровня.
  3. Только пользователь root может убить процесс, запущенный другими пользователями.

Примеры команд kill для завершения процесса в Linux

В этом примере я собираюсь убить серверный процесс lighttpd.

Шаг 1 — Узнайте PID (идентификатор процесса) lighttpd

Чтобы узнать PID любой программы, используйте команду ps или pidof. Например, если имя процесса — lighttpd, вы можете использовать любую из следующих команд для получения идентификатора процесса:

Примерный ответ терминала:

Или такой ответ:

lighttpd 3486 0.0 0.1 4248 1432 ? S Jul31 0:00 /usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf

lighttpd 3492 0.0 0.5 13752 3936 ? Ss Jul31 0:00 /usr/bin/php5-cg

Шаг 2 — убить процесс с помощью PID

Процессу lighttpd присвоен PID # 3486. Чтобы убить процесс lighttpd, требуется передать PID следующим образом:

Эта команда приведет к завершению процесса с PID 3486.

Шаг 3 — Как узнать, что процесс завершен / убит

Опять используйте команду ps или команду pidof, ну или команду pgrep следующим образом:

$ ps aux | grep lighttpd
$ pidof lighttpd
$ pgrep lighttpd

На экране не должно быть никакого вывода или PID.

Замечание об отправке более сильного сигнала # 9 (SIGKILL).

Если в команде kill не указан сигнал, по умолчанию посылается сигнал # 15 (SIGTERM). Таким образом, команда kill 3486 аналогична следующей команде:

$ sudo kill -15 3486
$ sudo kill -SIGTERM 3486

В некоторых случаях сигнала # 15 недостаточно. Например, lighttpd может не быть убит сигналом # 15 из-за открытых сокетов. Поэтому процесс (PID) # 3486 надо убить мощным сигналом # 9:

$ sudo kill -9 3486
$ sudo kill -SIGKILL 3486

Где -9 или -SIGKILL — это специальный сигнал kill, который почти гарантированно убивает процесс железным кулаком.

Как убить два или более PID в Linux?

Для того чтобы убить два или более PID, можно использовать одну команду:

kill pid1 pid2 pid3

kill -15 pid1 pid2 pid3

kill -9 pid1 pid2 pid3

kill -9 3546 5557 4242

Возможно вам будет интересно: Установка WordPress с LAMP Stack на Ubuntu 20.04

Команда killall

killall — это команда только для Linux. Она может быть доступна во FreeBSD и других Unix-подобных системах, таких как macOS, для уничтожения процессов по имени. Поэтому нет необходимости искать PID с помощью команд «pidof process» или «ps aux | grep process». Синтаксис команды следующий:

Например чтобы убить процесс на сервере lighttpd, введите:

Например чтоб завершить процесс веб-браузера Firefox, введите:

Внимание: Не используйте команду killall в операционных системах Solaris Unix.

Заключение

В этой стате мы показали как посмотреть и убить процесс из командной строки в Linux и Unix-подобных операционных системах. Как я уже говорил, команда killall в UNIX-подобных системах делает кое-что еще. Она убивает все процессы, а не только определенный процесс. Не используйте killall в Solaris.

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

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

[itechf2@////// ~]$ 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, при этом необходимо указывать имя процесса. Например:

[itechf2@///// ~]$ 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 же выполняет уничтожение процесса всегда, так как его нельзя перехватить или проигнорировать.

Читайте также: Прекращение поддержки Windows Server 2003

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

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

Занимаюсь IT с 2007 года. Всё началось с увлечения — разгона компьютерного оборудования. Много воды и азота утекло с тех пор. Сейчас уже более 3х лет со своей командой оказываю комплексную поддержку и продвижение бизнеса: SEO, Яндекс.Директ, рассылки и удалённое обслуживание серверов. Буду рад помочь, обращайтесь!

Команды kill и killall в Linux

Инструкция о том, как команд правильно использовать команды kill и killall.

Эта инструкция — часть курса «Linux: горячие клавиши и команды».

Смотреть весь курс

Введение

Мы привыкли, что Linux — семейство Unix-подобных операционных систем на базе одного ядра — отличается устойчивостью и стабильностью. Но даже в таких ОС в повседневной жизни можно столкнуться с ситуацией, когда программы начинают зависать, нестабильно отвечать или просто перестают работать. Например, они настолько медленно реагируют, что их нельзя закрыть обычным способом. Также не отвечающие приложения нельзя перезапустить, потому что исходный процесс приложения не завершается окончательно.

Первым решением, к которому обычно прибегают,— перезагрузка системы. Но еще в таких случаях можно «убить» запущенную программу при помощи команд kill и killall. Дальше мы подробно рассмотрим, как их правильно использовать.

Процессом мы называем любую выполняющуюся программу. Иначе еще его можно назвать функционирующим экземпляром программы. Если вы запустили два окна с одним и тем же приложением — это будет два процесса, а не один.

PID процесса

В Linux у процесса есть уникальный идентификатор Process ID или сокращенно PID. При создании каждого процесса ему автоматически присваивается PID.

Отношения между процессами в системе

Родителем называется процесс, который отвечает за создание дочернего процесса. Если родительский процесс завершится раньше, чем дочерний, то тогда «потомок» привяжется к init, который был создан первый при загрузке (но также есть опция переназначить дочерний процесс другому).

Если же дочерний процесс прекратит свою работу раньше, он останется без родителя до тех пор, пока «предок» не получит информацию про него или не сообщит ядру, что такая информация не требуется. Тогда ресурсы, используемые дочерним процессом, освобождаются.

Возможные значения PID

В зависимости от значения PID, который мы в дальнейшем будем передавать kill, сигнал будет отправляться разной группе процессов. Разберем, как именно значение PID влияет на отправку сигнала:

  • PID > 0. Сигнал будет послан процессу, чей идентификатор соответствует введенному значению.
  • PID = 0. Все процессы, входящие в текущую группу, получают этот сигнал.
  • PID = −1. В этом случае сигнал будет послан всем пользовательским процессам (если команду вызывает root, то сигнал идет всем процессам кроме init и самого kill). Для этого существует специальный идентификатор пользователя (UID).
  • PID < −1. Сигнал отправляется процессам, включенным в группу с GID (идентификатор группы), соответствующим абсолютному значению PID.

Как убить зависший процесс

Чтобы завершить конкретный процесс, мы должны понять, какой у него номер. Для этого обратимся к вспомогательным командам. Если мы хотим посмотреть работающие процессы, можно запустить удобный интерфейс командой top. Сначала она отобразит всю статистику по системе (нагрузку и общее количество задач), а после покажет все процессы, отсортированные в реальном времени по их нагрузке на процессор. Но такой способ неудобен для поиска конкретного PID.

  • ps — команда, выводящая перечень действующих процессов с дополнительными сведениями о них.
  • grep выполняется вместе с ps и ищет по списку, полученному от ps.

Чтобы извлечь все процессы, нужно написать в терминале:

ps axu

Зачастую этот список достаточно длинный и найти PID заданного процесса затруднительно. Тогда стоит обратиться к команде grep. Для поиска процесса, имеющего конкретное имя, нужно выполнить:

ps axu | grep bash

Команда осуществит поиск по результату, выданному командой ps, и на экране мы увидим только строки, содержащие bash.

Если такого процесса не найдется, то в качестве ответа мы получим сам grep: это происходит из-за того, что параметром указано слово bash и grep находит сам себя.

Если же такой процесс существует, то мы увидим подобный вывод:

root 447 0.0 0.4 7932 4708 tty1 S 11:26 0:00 -bash root 477 0.0 0.0 6268 640 tty1 S+ 11:27 0:00 grep bash

Нам здесь важна первая строчка. Число после имени пользователя и будет являться уникальным идентификатором.

Для нахождения PID еще можно попробовать команду pgrep — утилиту, которая просматривает активные процессы и выдает PID тех, чьи атрибуты удовлетворяют запросу:

pgrep firefox

Еще один вспомогательный способ определения PID: pidof — команда, принимающая на вход название:

pidof gcalctool

Если исполняемая программа задействует не один процесс, то команда в результате выведет все идентификаторы.

Команда kill

Теперь, зная PID, процесс можно принудительно остановить. Применим команду kill, передав вместе с ней номер:

kill 279

kill шлет сигнал: не указывая аргументом, какой именно сигнал мы хотим отправить, по умолчанию идет SIGTERM. Сигнал сообщает потребность в завершении процесса. Кроме того, процессу предоставляется возможность потенциально остановиться без ошибок, освободив ресурсы. Сложность заключается в том, что сигнал может быть проигнорирован. У всех сигналов есть номер, у SIGTERM, например, 15. Чтобы узнать список всех возможных сигналов и их номеров, нужно ввести следующее:

kill -l

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

kill −9 279

После выполнения несохраненный прогресс будет утерян. Тут обратим внимание, что команда kill может быть внутренней (часть встроенной функции оболочки) или внешней (находящейся по адресу /bin/kill). Независимо от этого синтаксис остается одинаковым. Чтобы найти все упоминания kill в системе, выполните следующее:

type -a kill

Примечание: с помощью kill можно убивать сразу несколько процессов. Для этого указываем их PID подряд через пробел:

kill −9 267 315 442

Либо если вы не хотите указывать каждый PID по отдельности вручную, можно сделать так:

kill −9 $(pidof gcalctool)

Утилита pkill

pkill — оболочка для kill. Она позволяет применять регулярные выражений или другие критерии для нахождения процессов. У нее такой же синтаксис, как и у команды kill, но в качестве PID можно передать имя процесса (или часть его имени). Утилита работает следующим образом: она просматривает директорию proc и находит идентификатор первого процесса с подходящим именем. После этого отправляет этому процессу SIGTERM.

pkill ping

Аналогично мы можем задать тип сигнала:

pkill -TERM ping

Еще раз нужно отметить, что эта утилита убивает только первый найденный процесс. Поэтому если у вас открыто несколько вкладок в браузере, то pkill закроет только одну из них.
Также у команды pkill есть и другая опция: если ввести флаг -u, то после мы можем написать имя пользователя (или его ID).

pkill -u user

Так мы остановим первый процесс, заданный этим пользователем.

Команда killall

killall — команда, которая прерывает процессы с одним и тем же названием. Если у вас будет запущено несколько окон с одинаковыми приложениями (а мы уже знаем, что это будут разные процессы), killall уничтожит все. Еще одно отличие заключается в том, что здесь нет необходимости знать PID (команда ищет все подходящие в папке /proc). Если мы аналогично одному из примеров, хотим закрыть окна калькулятора, нужно написать:

killall gcalctool

Без аргументов killall также отправляет сигнал SIGTERM. Для отправки другого сигнала нужно явно это прописать:

killall -s 1 gcalctool

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

man killall

Как проверить, что процесс убит

Чтобы убедиться, что процесс был действительно отменен, надо воспользоваться одним из способов:

ps aux | grep
pidof 
pgrep 

При успешном окончании эти команды ничего не выведут.

Подробности о завершении процессов

Права пользователя root

Обычному пользователю доступно завершить только собственные процессы. Это объясняется тем, что для передачи сигналов может не хватать прав. Однако root может посылать сигналы и чужим процессам.

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

sudo kill 279

Также только у root есть права на отмену процесса системного уровня.

Использование виртуальной консоли

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

Отправка сигналов в Linux

Теперь подробнее разберем, что такое сигналы и как они работают. В Linux взаимодействие с процессами осуществляется через программные прерывания — сигналы. Система или сам пользователь передают их, вводя команды. После того как процесс получил сигнал об окончании, ему желательно осуществить некоторые подготовительные шаги.

Чтобы полностью завершить выполнение процесса, необходимо также прервать дочерние элементы, удалить временные файлы и другие дополнительные действия. Однако процесс может отреагировать не на каждый сигнал. Сигнал, остановивший процесс, выполнил свою главную задачу. Разберем сигналы, еще не описанные до этого.

  • SIGINT (2) — самый безопасный сигнал для отмены процесса. После этого процесс правильно завершается, и управление возвращается. Также его можно отправить с помощью клавиш Ctrl + C.
  • SIGQUIT (3) — этот сигнал также сообщает программе об окончании. Программа либо выполняет корректное завершение, либо игнорирует сигнал. В отличие от SIGINT, этот сигнал генерирует содержимое рабочей памяти одного процесса. Можно послать с помощью клавиатуры, используя сочетание Ctrl + /.
  • SIGHUP (1) перезагружает процесс, а также используется для перезагрузки файлов конфигурации и открытия или закрытия файлов журнала. Чаще посылается системой при потере соединения с интернетом и сообщает процессу об отсутствии связи с управляющим терминалом.

Чтобы процесс завершился верно, порты и сокеты освобождаются и закрываются, а также удаляются временные файлы. Поэтому не стоит использовать сразу радикальные меры — передавать SIGKILL. Сначала пытаемся завершить процесс в следующем рекомендуемом порядке:

  1. SIGINT (Ctrl + C).
  2. SIGTERM — аккуратно останавливает процесс.
  3. SIGKILL — последнее средство для завершения.

До этого мы уже привели несколько примеров, как можно задать тип сигнала. Подведем итоги:

  1. Номер (-1 или -s 1).
  2. Полное название (-SIGHUP или -s SIGHUP).
  3. Сокращенное название, без префикса «SIG» (-HUP или -s HUP).

Настройка процессов

Перезагрузка процессов с помощью kill

Мы уже знаем, что команда kill и сигнал SIGHUP объявляют, что требуется обновить настройки. Чтобы подробнее разобрать, как это происходит, рассмотрим Nginx. Чтобы перезапустить сервер, нужно послать сигнал главному процессу. Идентификатор ведущего процесса находится в файле nginx.pid, который обычно расположен в каталоге /var/run.

Теперь воспользуемся командой cat, которая последовательно считывает содержимое файла и записывает его в стандартный поток вывода:

cat /var/run/nginx.pid

После этого мы увидим искомый PID. Теперь осталось обновить настройки, написав:

sudo kill −1 740

Эту команду можно запустить от root или с привилегиями sudo.

Управление приоритетами процессов

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

Для контроля приоритетов у Linux есть понятие вежливости. Самые приоритетные задачи считаются менее вежливыми, потому что они не делятся ресурсами. Тогда процессы с низким приоритетом считаются более вежливыми, потому им требуется минимум ресурсов.

В выводе команды top есть столбец NI, целью которого является отобразить значение вежливости. Вежливость может варьироваться от −20 (наибольший приоритет) до 20 (соответственно, наименьший).

Если по каким-то причинам мы хотим посмотреть на программу с определенным значением вежливости, то мы воспользуемся nice:

nice -n 10

А для того чтобы изменить значение вежливости у уже выполняемой программы, воспользуемся инструментом renice, которому передаем PID:

renice 11

Заключение

Команды kill и killall — мощные инструменты в Linux. Они позволяют прекратить выполнение запущенных процессов. Они представляют собой неотъемлемую частью администрирования Linux и применяются в различных сценариях, таких как прекращение работы процессов, вызов перезапуска служб и многих других.

Несмотря на их эффективность, необходимо быть осторожным при написании команд kill и killall, так как неправильное обращение может привести к удалению данных и неожиданным последствиям. Рекомендуем ознакомиться с руководством по применению этих команд, чтобы убедиться, что они используются правильно и безопасно.

Перенаправление ввода/вывода в Linux

Команда ifconfig в Linux: установка, синтаксис и примеры использования

Зарегистрируйтесь в панели управления

И уже через пару минут сможете арендовать сервер, развернуть базы данных или обеспечить быструю доставку контента.

Читайте также:

Инструкция

Как создать 100 серверов в облаке за минуту? Работа с OpenStack клиентом

Инструкция

Как создать веб-приложение на базе Telegram Mini Apps

Инструкция

Что делает команда chmod и как ее использовать в Linux

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *