Как завершить процесс по имени в Linux

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

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

«Уничтожение» процесса — это одна из полезных опций, которую Linux предоставляет вам для остановки текущих процессов, будь то процесс переднего плана или фоновый процесс. В этой статье мы рассмотрим такие команды, как kill, pkill и killall для принудительного завершения любого процесса в системе.

Зачем убивать процесс?

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

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

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


Используя команду pgrep

Большинство пользователей Linux знакомы с этой командой grep. Команду pgrep можно использовать в похожих строках grep.

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

Общий синтаксис:

pgrep [options] [pattern]

Важные параметры, доступные с помощью pgrepкоманды

ВариантОписание
-uсписок идентификаторов процессов, принадлежащих определенному пользователю
-cподсчитать количество соответствующих процессов
-Iперечислить только имена процессов
-aсписок полный путь имени процесса

Давайте продемонстрируем использование команды pgrep на примере.

pgrep -u gaurav gnome

Опция -u позволяет вам перечислить pids процессов, принадлежащих определенному пользователю. В данном случае, пользователю gaurav.

Вывод:

gaurav@ubuntu:~$ pgrep -u gaurav gnome
1752
1755
1909
1922
2021
2576
4279
gaurav@ubuntu:~$

По мере продвижения по этому уроку команда pgrep поможет нам подтвердить, был ли процесс завершен или все еще выполняется.

Перейдем теперь к команде pkill и ее исполнению.


Использование команды pkill

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

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

Синтаксис:

pkill [options][process_name_pattern] 

Пример:

Давайте отобразим текущие запущенные процессы с помощью команды top. Вы также можете использовать команду ps для вывода списка процессов.

top
top - 14:24:02 up  3:12,  1 user,  load average: 0.29, 0.48, 0.58
Tasks: 221 total,   1 running, 172 sleeping,   0 stopped,   1 zombie
%Cpu(s):  5.6 us,  1.0 sy,  0.0 ni, 92.9 id,  0.4 wa,  0.0 hi,  0.1 si,  0.0 st
KiB Mem:  3928240 total,   610456 free,  2233152 used,  1084632 buff/cache
KiB Swap:  4083708 total,  3378884 free,   704824 used.  1187268 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                           
 4077 gaurav   20   0 3312128 673480 118360 S  19.6 17.1  15:13.23 Web Content                                                                       
 3712 gaurav   20   0 3953008 453544 116476 S   4.0 11.5   9:28.39 MainThread                                                                        
 2010 gaurav   20   0 4084232 111096  45024 S   1.7  2.8   3:14.85 gnome-shell                                                                       
 1197 root      20   0 1039612  33704  22988 S   1.0  0.9   3:04.42 Xorg                                                                              
 1426 couchdb   20   0 3772396  16908   2520 S   0.7  0.4   1:50.83 beam.smp                                                                          
 3288 gaurav   20   0  722480  25048  18272 S   0.7  0.6   0:06.84 gnome-terminal-                                                                   
 3915 gaurav   20   0 2804900 231524 111228 S   0.7  5.9   0:54.42 Web Content                                                                       
 4146 gaurav   20   0 3017924 245304 120604 S   0.7  6.2   2:01.21 Web Content                                                                       
 4417 gaurav   20   0 2964208 234396 119160 S   0.7  6.0   0:59.90 Web Content                                                                       
 4860 gaurav   20   0 3066800 372920 132544 S   0.7  9.5   0:48.20 Web Content                                                                       
16007 gaurav   20   0   41944   3780   3116 R   0.7  0.1   0:00.28 top            

Использование команды top отобразит несколько процессов на вашем терминале. Давайте попробуем отобразить процесс с определенным именем. Мы используем команду grep для отображения процесса, имя которого соответствует строке ‘mongo’.

top | grep -i mongo

Примечание: здесь я использовал опцию -i, чтобы сделать поиск нечувствительным к регистру.

Вывод этой команды отобразит процессы, соответствующие имени «mongo».

 1158 mongodb   20   0  288564   4848   1320 S   0.7  0.1   1:03.22 mongod      
 1158 mongodb   20   0  288564   4848   1320 S   1.0  0.1   1:03.25 mongod      
 1158 mongodb   20   0  288564   4848   1320 S   0.7  0.1   1:03.27 mongod      
 1158 mongodb   20   0  288564   4848   1320 S   0.7  0.1   1:03.29 mongod      
 1158 mongodb   20   0  288564   4848   1320 S   0.7  0.1   1:03.31 mongod      
 1158 mongodb   20   0  288564   4848   1320 S   0.7  0.1   1:03.33 mongod      
 1158 mongodb   20   0  288564   4848   1320 S   1.0  0.1   1:03.36 mongod      
 1158 mongodb   20   0  288564   4848   1320 S   0.7  0.1   1:03.38 mongod      
 1158 mongodb   20   0  288564   4848   1320 S   0.7  0.1   1:03.40 mongod      
 1158 mongodb   20   0  288564   4848   1320 S   1.0  0.1   1:03.43 mongod      
 1158 mongodb   20   0  288564   4848   1320 S   0.7  0.1   1:03.45 mongod      
 1158 mongodb   20   0  288564   4848   1320 S   1.0  0.1   1:03.48 mongod      
 1158 mongodb   20   0  288564   4848   1320 S   0.3  0.1   1:03.49 mongod      
 1158 mongodb   20   0  288564   4848   1320 S   1.0  0.1   1:03.52 mongod      
 1158 mongodb   20   0  288564   4848   1320 S   0.7  0.1   1:03.54 mongod      
 1158 mongodb   20   0  288564   4848   1320 S   1.0  0.1   1:03.57 mongod

Теперь мы воспользуемся командой pkill для завершения процесса с именем «mongo».

pkill mongo

Эта команда теперь убьет процесс mongo. Мы можем подтвердить, был ли процесс принудительно завершен, используя команду pgrep, которая отображает pid запущенного процесса в соответствии с критериями, указанными пользователем.

gaurav@ubuntu:~$ pgrep mongo
gaurav@ubuntu:~$

Эта команда не вернет никакого значения. Это подтверждает, что процесс ‘mongo’ теперь завершен с помощью команды pkill.


Параметры, часто используемые с командой pkill

При использовании команды pkill нам понадобятся указанные опции для правильного и легкого использования команды pkill.

ПараметрыОписание
-fсопоставлять с полными аргументами, включая пробелы, кавычки, специальные символы
-uдля информирования процесса pkill о необходимости соответствия процессу, запущенному указанным пользователем
-1перезагружает процесс
-9убивает процесс
-15изящно прерывает процесс

Давайте рассмотрим еще один пример команды pkill, использующей опцию -f.

В настоящее время на терминале выполняются две команды, как показано ниже.

ping bbc.com

ping youtube.com

Оба процесса инициируются командой ping. Теперь предположим, что мы хотим завершить только один процесс «ping youtube.com», тогда нам нужно использовать опцию -f с командой pkill, которая завершает процесс с определенным именем, включая пробелы и кавычки из имени процесса.

Команда:

gaurav@ubuntu:~$ pkill -f "ping youtube.com"
gaurav@ubuntu:~$ 

Результат:

gaurav@ubuntu:~$ ping youtube.com
PING youtube.com (142.250.67.206) 56(84) bytes of data.
64 bytes from bom12s08-in-f14.1e100.net (142.250.67.206): icmp_seq=1 ttl=117 time=30.9 ms
64 bytes from bom12s08-in-f14.1e100.net (142.250.67.206): icmp_seq=2 ttl=117 time=121 ms
64 bytes from bom12s08-in-f14.1e100.net (142.250.67.206): icmp_seq=206 ttl=117 time=86.5 ms
64 bytes from bom12s08-in-f14.1e100.net (142.250.67.206): icmp_seq=207 ttl=117 time=105 ms
Terminated
gaurav@ubuntu:~$

В данном случае процесс «ping youtube.com» завершен, а «ping bbc.com» все еще выполняется на терминале.

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


Сигналы, используемые с командой pkill

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

Ниже приведен список доступных сигналов.

СигналСпецификация
1(HUP)перезагружает указанный процесс
9(KILL)убивает указанный процесс
15(TERM)мягко останавливает или прерывает указанный процесс

В этом уроке мы будем в значительной степени полагаться на KILLсигнал. Давайте рассмотрим несколько примеров, чтобы лучше понять это.

Использование команды pgrep для получения pid соответствующий имени apache.

gaurav@ubuntu:~$ pgrep apache
1218
10402
10403
gaurav@ubuntu:~$
pkill -KIll apache

ИЛИ вы также можете использовать команду с цифрами (например, 1, 9, 15)

pkill -9 apache

Обе команды, показанные выше, завершат процесс apache. Подтверждаем командой еще раз pgrep.

gaurav@ubuntu:~$ pgrep apache
gaurav@ubuntu:~$

Поскольку команда pgrep не возвращает никаких выходных данных, это доказывает, что процесс apache был завершен.


Заключение

В этом уроке мы узнали о команде pkill и о том, как она используется для завершения процесса, используя имя процесса напрямую. Мы также узнали о команде pgrep, которая используется для получения идентификатора процесса, запущенного любым конкретным пользователем. Команда позволяет pgrep нам перепроверить, завершен ли процесс.