Если вы работали с любым дистрибутивом Linux, вы знаете, что под капотом процессы представляют все, от приложений до устройств. Приложения инициируют множество процессов для обеспечения различных функциональных возможностей.
Процессы могут зависать по нескольким причинам, включая попадание в цикл или ожидание ввода от других процессов и устройств. Зависшие процессы могут замораживать элементы пользовательского интерфейса и негативно влиять на взаимодействие с пользователем.
Вот почему Linux позволяет пользователям завершать процессы различными командами.
В этой статье мы обсудим, как завершить процесс в Linux. Мы начнем с краткого обсуждения того, как составить список процессов, чтобы получить соответствующие идентификаторы процессов. Далее мы подробно рассмотрим команды, которые вы используете для завершения процесса в Linux.
Как найти идентификатор процесса в Linux
Каждый процесс, независимо от того, запущен ли он пользователями или системными компонентами, имеет числовой идентификатор (называемый PID), который однозначно идентифицирует его во всей системе.
Интересная особенность процессов и PID заключается в том, что всем экземплярам одного и того же процесса присваивается уникальный PID. В результате вы можете различать экземпляры и выбирать для завершения конкретный экземпляр, а не все экземпляры процесса. Это очень полезно в ситуациях, когда вы запускаете параллельные экземпляры утилиты, такой как менеджер пакетов.
Процессы в вашей системе Linux можно условно разделить на две категории – процессы переднего плана и фоновые процессы. Сейчас мы обсудим, как найти PID процессов переднего плана или фоновых процессов.
Найдите идентификатор процесса процессов переднего плана
Linux предлагает несколько вариантов просмотра информации (включая PID) о процессах переднего плана. Мы упомянем три команды, которые помогут вам определить правильный PID, который вы можете использовать для завершения процесса.
Метод № 1: найдите PID с помощью команды ps
Команда ps – это очень гибкий способ обнаружения процессов, запущенных в системе. При использовании без каких-либо параметров она просто отображает процессы переднего плана для текущего вошедшего в систему пользователя. Эта команда также используется для определения текущего PID оболочки.
Синтаксис команды следующий:
# ps
Однако вы можете получить более полное представление о процессах, добавив в команду флаги a, u и x. Выходные данные команды показывают конкретную команду, связанную с PID. Команда в данном контексте:
# ps aux
Метод № 2: найдите PID с помощью команды pidof
Если вы знаете имя процесса, вы можете использовать команду pidof, чтобы найти его PID. Синтаксис команды таков:
# pidof <flags> <process name>
Эта команда поддерживает следующие флаги:
- -c: Предоставьте PID для процессов пользователю root.
- -o: Опустите некоторые PID.
- -s: возвращает один PID.
- -x: Включает PID скриптов, выполняемых в командной оболочке.
Например, рассмотрим следующую команду, чтобы получить PID, связанный с командой cat в нашей тестовой системе:
# pidof cat
Метод № 3: Найдите PID, связанный с пользователем, с помощью pgrep
pgrep – это простая команда для возврата информации о процессе с помощью частичного шаблона. Например, команда использует регулярное выражение (a *) в качестве шаблона подстановки. Синтаксис этой команды таков:
pgrep <flags> <pattern>
Вы можете использовать следующие флаги с помощью команды pgrep:
- -l: содержит список PID и имен процессов.
- -n: возвращает самый последний процесс.
- -o: возвращает самый старый процесс.
- -u: возвращает процессы, связанные с конкретным пользователем.
- -x: возвращает процессы, которые точно соответствуют указанному шаблону.
Типичным вариантом использования этой команды является следующая команда, которая перечисляет все процессы от пользователя root, которая содержит “a” в начале имени процесса.
# pgrep -l -u root 'a*'
Найдите идентификатор процесса фоновых процессов
Прежде чем вы сможете завершить фоновый процесс, вам необходимо знать правильный PID. Вы можете использовать команды ps и pidof, чтобы найти PID для фоновых процессов.
Метод № 1: найдите фоновый PID с помощью команды ps
Вы можете использовать слегка измененную версию команды ps для получения списка PID процессов, соответствующих определенному имени процесса. Обратите внимание, что синтаксис этой команды передает выходные данные команды ps в grep для фильтрации выходных данных:
# ps -e | grep -i 'pattern'
Метод № 2: используйте лучшую утилиту
Утилита top предлагает подробное представление системных процессов. Простым вызовом утилиты из командной строки вы можете получить описание всех активных процессов, включая фоновые.
# top
Нажмите “q“, чтобы выйти из утилиты.
Как завершить процессы в Linux
Теперь, когда вы знаете, как найти PID процесса, мы можем перейти к следующей половине этой статьи. Здесь мы обсудим два метода завершения процесса.
Метод № 1: Используйте команду top для завершения процессов Linux
Вы знаете, как использовать утилиту Top для составления списка процессов, чтобы узнать PID процесса, который вы хотите завершить. Эта команда также отображает идентификаторы пользователей и процессов, а также информацию об использовании памяти и процессора каждым процессом. Кроме того, вы можете завершить процесс с помощью этой утилиты. Для этого выполните следующие действия:
- Запустите утилиту:
# top
- Используйте стрелки ВВЕРХ или ВНИЗ, чтобы переместить процесс, который вы хотите завершить, в начало списка. Например, мы хотим завершить процесс, связанный с утилитой top.
- Нажмите k, чтобы отправить процессу сигнал выбора kill. Утилита попросит вас ввести PID для завершения процесса.
- Утилита отправит процессу сигнал SIGTERM/15, эффективно завершая его.
Метод № 2: Используйте команду kill для завершения процессов
Команда kill очень универсальна и поставляется с несколькими связанными утилитами для удовлетворения конкретных сценариев.
Прежде чем углубляться в детали команды kill и связанных с ней утилит, важно понять, как работает команда kill, и идею сигналов.
Что такое команда kill?
Когда вы вводите команду kill и включаете PID, команда отправляет процессу сигнал TERM/15 по умолчанию. Этот сигнал дает процессу достаточно времени для сохранения любых несохраненных данных и обеспечения плавного завершения. Однако вы можете отправлять другие сигналы для завершения процессов в определенных условиях. Вот краткий обзор наиболее распространенных сигналов, которые вы можете использовать с помощью команды:
- SIGHUP/1: этот сигнал завершает работу или перезагружает процесс. Такое поведение контролируется конфигурацией терминала.
- SIGINT/2: это отправляет процессу прерывание с клавиатуры. В большинстве оболочек это похоже на ^ C.
- SIGKILL/9: это немедленно отправляет процессу сигнал завершения.
- SIGTERM/15: Это отправляет процессу корректный сигнал завершения.
Вы можете запустить команду kill -l для получения полного списка всех сигналов.
Вы можете уничтожить несколько процессов одной командой, добавив PID к команде kill. Мы рекомендуем соблюдать крайнюю осторожность при вводе PID, поскольку система не будет проверять список PID и отправлять сигнал SIGTERM или SIGKILL.
Синтаксис команды следующий:
# kill <PID1> <PID2> …
Системные вызовы kill очень гибкие и подходят для всех важных сценариев, когда вам нужно вмешаться в нормальный ход выполнения процесса.
Kill 9 (SIGKILL): немедленно завершить процесс
Вы можете немедленно завершить процесс, отправив ему сигнал kill 9 (SIGKILL). Процесс, не отвечающий на запросы, может не отправлять никакой обратной связи, но завершается при получении инструкции kill -9. Обратите внимание, что команда не соответствует стандартному процессу завершения работы и, следовательно, может привести к потере данных.
Рассмотрим следующую команду для завершения фиксированного процесса с PID 29046:
# kill -9 29046
Это отправляет системный вызов kill процессу. Мы использовали команду ps, чтобы проверить, был ли этот вызов kill 9 успешным
# ps 29046
Команда killall
Используйте команду killall, чтобы завершить процесс по имени. Эта команда по умолчанию выдает сигнал SIGTERM. Эта команда может завершить несколько процессов за один раз.
Синтаксис этой команды таков:
# killall <process>
Вы можете использовать следующие флаги с командой:
- -e: ищет точное совпадение имени процесса.
- -I: Не обращайте внимания на регистр при попытке найти имя процесса.
- -i: запрашивает подтверждение перед завершением процесса.
- -u: убивает процессы, принадлежащие определенному пользователю.
- -v: предоставляет обновленную информацию об успешном или неудачном завершении процесса
Команда killall может использоваться для завершения процессов по возрасту (продолжительности времени). Для этого используйте следующие флаги вместе с командой:
- -o: Укажите длительность с этим флагом, чтобы завершить все процессы, которые выполнялись дольше этого периода.
- -y: Укажите длительность с этим флагом, чтобы завершить все процессы, которые выполнялись менее этого периода.
Например, команда killall -o 15m завершит работу процессов, которым более 15 минут. Аналогично, команда killall -y 15m уничтожит процессы, которым меньше 15 минут.
Другой вариант использования команды killall заключается в уничтожении нескольких процессов путем упоминания их имен в команде. Синтаксис команды следующий:
# killall <process_name_1> <process_name_2> <process_name_3>
Вы можете использовать этот синтаксис команды для завершения процессов с похожим именем. В этом контексте мы рекомендуем использовать подстановочный знак для включения всех связанных процессов:
# killall <process_name>*
Как и в большинстве системных вызовов kill, вы можете указать сигнал в команде killall. По умолчанию команда killall отправляет процессам сигнал SIGTERM. Вы можете изменить это с помощью следующего синтаксиса команды:
# killall -s SIGKILL <process_name_1> <process_name_2> <process_name_3>
Команда pkill
Команда pkill похожа на команду pgrep в том смысле, что она завершит процесс после обнаружения процесса на основе определенных критериев. По умолчанию команда выдает сигнал SIGTERM.
Синтаксис команды таков:
# pkill <flags> <pattern>
Вы можете использовать следующие флаги с помощью команды pkill:
- -n: завершает только самый последний найденный процесс.
- -o: завершает только самые старые процессы.
- -u: завершает только процессы, принадлежащие определенному пользователю.
- -x: завершает только те процессы, которые точно соответствуют упомянутому шаблону.
- (signal): Вместо SIGTERM отправьте процессу другой сигнал.
Команда xkill
Команда xkill обычно используется для прекращения связи сервера с клиентами. Синтаксис команды таков:
# xkill <resource>
Как остановить процесс в Linux
Вместо завершения вы можете остановить процесс, отправив соответствующий сигнал SIGSTOP. Обратите внимание, что этот сигнал действует как кнопка приостановки процесса.
Рассмотрим следующую команду, которая отправляет сигнал SIGSTOP фиксированному процессу с PID 30866. Теперь мы отправим сигнал SIGSTOP этому процессу следующей командой:
# kill -s SIGSTOP 30866
Теперь проверьте состояние процесса с помощью следующей команды ps:
# ps 30866
В столбце STAT выходных данных отобразится T, что указывает на то, что процесс остановлен.
Вы можете использовать этот процесс для завершения процесса в Unix-подобных средах, которые поддерживают стандартную реализацию команды kill. Это полезная идея, когда вы хотите временно заблокировать выполнение процесса.
Это обычное операционное требование при запуске процесса, выполнение которого занимает много времени. В других случаях процессу часто приходится ждать завершения других процессов, чтобы выходные данные этих процессов можно было использовать в качестве входных данных для целевого процесса.
Уничтожение процессов оболочки
Важным вариантом использования для завершения процессов в Linux является завершение текущей оболочки. Оболочка может зависнуть во время операции или перестать отвечать на запросы в ожидании ответа. В этих случаях самый простой вариант – отключить оболочку и запустить новый терминал.
Это, казалось бы, невозможное действие возможно, потому что в Linux оболочка – это просто еще один процесс, запущенный в системе.
Первый шаг этого процесса – узнать PID вашей текущей оболочки. Для этого перейдите в оболочку и получите идентификатор процесса текущего процесса (оболочки). Команда для получения этого PID выглядит следующим образом:
# echo $$
Теперь вы можете использовать PID процесса оболочки с помощью команды kill -9, чтобы завершить работу оболочки.
Важные указания по завершению процесса в Linux
При выполнении команды для завершения процессов учитывайте следующее:
- Если другого способа нет, вы можете завершить процесс вручную из командной строки.
- Вы всегда должны находить PID для процессов, которые хотите завершить. Это гарантирует, что вы случайно не завершите системный процесс и не приведете к сбою сервера. Мы рекомендуем использовать команды top, ps, pidof или pgrep.
- Как только процесс, который вы хотите завершить, будет найден, вы можете использовать команды killall, pkill, kill, xkill или top, чтобы завершить его.
- Вы можете использовать сигналы завершения SIGHUP, SIGKILL или SIGTERM для запуска процесса завершения в Linux.
- Используйте команду sudo, чтобы убедиться, что у вас есть надлежащие разрешения для завершения процесса.
- Помните, что процессы, приостановленные с помощью kill %2 , все еще могут занимать системные ресурсы. Вам следует тщательно взвесить преимущества приостановки процесса по сравнению с требованиями к системным ресурсам для обеспечения стабильности системы.
Заключение
Знание того, как остановить процесс в Linux, является ключом к поддержанию стабильной и отзывчивой системы Linux.
Вы можете использовать такие команды, как kill и pkill, для отправки процессам определенных сигналов завершения. Обратите внимание, что некоторые команды могут принудительно завершать процессы, что приводит к потере данных.
Вопросы и ответы
Вопрос: Как завершить процесс в Unix / Linux?
Вы можете завершить процесс в среде операционной системы на базе Unix, инициировав системный вызов kill. В зависимости от ситуации вы можете использовать системные вызовы kill SIGTERM/15 или SIGKILL/9.
Вопрос: Какова цель завершения процесса в Linux?
Завершение процесса в Linux необходимо по разным причинам, таким как завершение работы не отвечающих на запросы или неисправных приложений, управление системными ресурсами и поддержание стабильности системы.
Вопрос. В чем разница между командами “kill” и “pkill”?
Команда kill отправляет сигналы по умолчанию определенным процессам, используя их идентификаторы процессов (PID), в то время как “pkill” позволяет завершать процессы по имени, что делает ее более удобной для пользователя.
Вопрос: Какой сигнал отправляется по умолчанию при использовании команды “kill”?
По умолчанию команда kill отправляет сигнал SIGTERM, позволяя процессу выполнить операции очистки перед завершением.
Вопрос: Как я могу принудительно завершить процесс, который не отвечает на сигнал SIGTERM?
Чтобы принудительно завершить процесс, используйте команду kill с сигналом SIGKILL (номер сигнала 9).
Вопрос: Существуют ли какие-либо риски, связанные с завершением процессов в Linux?
Да, завершение процессов следует выполнять осторожно. Завершение критически важных для системы процессов или приложений может привести к нестабильности системы или потере данных. Важно определить правильный процесс для завершения.
Вопрос: Могу ли я автоматизировать процесс завершения определенных процессов в Linux?
Да, вы можете создавать сценарии или использовать такие инструменты, как pkill, в сочетании с другими командами для автоматизации процесса завершения определенных процессов.
Вопрос. Возможно ли отправлять пользовательские типы сигналов процессам с помощью команды kill?
Да, вы можете отправлять пользовательские сигналы, указав номер сигнала при использовании команды kill . Это позволяет более детально контролировать процесс завершения.
Вопрос: Как я могу проверить, какие процессы запущены в моей системе Linux, прежде чем принимать решение, какие из них следует завершить?
Вы можете использовать команду ps для составления списка запущенных процессов. Это предоставляет информацию об их PID, использовании ресурсов и состоянии.
Вопрос. Какие шаги я должен предпринять после завершения процесса, чтобы обеспечить стабильность системы?
После завершения процесса крайне важно отслеживать поведение системы и устранять любые проблемы, которые могли привести к неправильному поведению процесса или его невосприимчивости.
Вопрос: Существуют ли альтернативы уничтожению процессов для управления системными ресурсами в Linux?
Да, вы можете использовать инструменты управления ресурсами, такие как nice и renice, чтобы настроить приоритеты процессов или по возможности увеличить системные ресурсы, чтобы не завершать процессы.