Поиск по сайту:

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


Уничтожение процесса иногда является единственным способом избавиться от него. Несмотря на резкое название, «убить» процесс означает просто «заставить его завершить работу». Вот как это сделать из командной строки Linux или macOS.

Что такое процесс?

Запуск программ, таких как веб-браузер, фоновые процессы, связанные с окружением рабочего стола, и системные службы Linux — все это процессы.

Вы можете объединить процессы в две группы:

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

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

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

Гуманный ответ

«Убить» процесс просто означает «заставить процесс завершить работу». Это может быть необходимо, если процесс отказывается отвечать.

Linux предоставляет команды kill, pkill и killall, позволяющие вам сделать именно это. Эти команды можно использовать с любым типом процесса, графическим или командным, передним или фоновым.

Команда убить

Чтобы использовать kill, вы должны знать идентификатор процесса (PID) процесса, который вы хотите завершить. Команду ps можно использовать для поиска PID процесса.

Чтобы ps выполнял поиск по всем процессам, используйте параметр -e (все процессы). Рекомендуется направлять вывод через less, его будет довольно много. Введите ps, пробел, -e, пробел, | (вертикальная черта), еще один пробел, а затем введите less. Нажмите Enter, чтобы выполнить команду.

ps -e | less

Это даст вам список процессов, похожий на скриншот ниже. Вы можете искать вперед в less, используя ключ /, и вы можете искать назад, используя ключ ?.

Чтобы сосредоточиться на интересующем вас процессе, перенаправьте вывод из ps через grep и укажите имя — или часть имени — процесса.

ps -e | grep shutter

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

kill 2099

Команда kill — это тихий убийца — она не дает вам никакой обратной связи, если она была успешной.

Он также работает точно так же для уничтожения процессов в macOS.

Команда pkill

Команда pkill позволяет вам убить процесс — или процессы — по имени. Вам не нужно идентифицировать процесс по PID. Чтобы использовать pkill, вы предоставляете поисковый запрос, который pkill использует для сверки со списком запущенных процессов. Процессы сопоставления прекращаются. Поэтому вы должны быть уверены, что правильно написали этот поисковый запрос.

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

Предположим, есть процесс, в имени которого есть «subq». Мы будем использовать ps -u dave | grep, чтобы заглянуть за кулисы. Вы можете видеть, что «subq» будет соответствовать этому процессу и только этому процессу. Это было просто для того, чтобы вы могли увидеть полное название процесса.

ps -u dave | grep subq

Предположим, что наш пользователь не сделал этого; все, что им известно, это то, что имя процесса содержит подстроку «subq». Они используют pgrep, чтобы проверить, есть ли только одно совпадение с поисковым запросом. Затем они используют этот поисковый запрос с pkill.

pgrep subq
pkill subq

Вы можете использовать pkill для уничтожения нескольких процессов одновременно. Здесь пользователь запускает pgrep, чтобы проверить, сколько процессов запущено Chrome. Они используют pkill, чтобы убить их всех. Затем они проверяют с помощью pgrep, что все они были удалены.

pgrep chrome
pkill chrome
pgrep chrome

Если запущено несколько процессов с одинаковым именем, но вы не хотите убивать их все, вы можете использовать pgrep с параметром -f (командная строка), чтобы определить, какой из них процесс какой. Простым примером могут быть два процесса ping. Вы хотите убить одного из них, но не другого. Вы можете использовать их командные строки, чтобы различать их. Обратите внимание на использование кавычек для заключения параметра командной строки.

pgrep -f "ping 192.168.4.22"
pkill -f "ping 192.168.4.22"

Команда killall

Предупреждение. В операционных системах Solaris и OpenIndiana команда killall уничтожит все принадлежащие вам процессы. Если у вас root или вы ввели sudo killall, вы перезагрузите компьютер! Во время исследования для этой статьи такое поведение было подтверждено последней версией OpenIndiana Hipster 2018.10.

Команда killall работает аналогично команде pkill, но с определенным отличием. Вместо того, чтобы передавать критерий поиска в команду, вы должны указать точное имя процесса.

Вы не можете указать частичное совпадение с именем процесса; вы должны указать полное имя процесса, как показано ниже:

killall shutt
killall shutter

Параметр -y (моложе чем) позволяет завершать процессы, которые выполнялись меньше указанного периода. Период указывается цифрами, за которыми следует одна из следующих единиц:

  • с (секунды)
  • м (минуты)
  • ч (часы)
  • д (дней)
  • н (недель)
  • М (месяцы, примечание, заглавная буква М)
  • г (лет)

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

killall -y 2m ana

Параметр -o (старше, чем) позволяет завершать процессы, которые выполнялись дольше указанного периода. Эта команда уничтожит все соединения ssh, которые работают дольше суток:

killall -o 1d sshd

Не будь слишком триггерным счастливым

Эти команды позволят вам точно и безопасно правильно идентифицировать и завершить ошибочные процессы.

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

RELATED: Best Linux Laptops for Developers and Enthusiasts