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

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

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

Отправка сигналов процессам по PID

Наиболее распространенный способ передачи сигналов в программу — использовать команду .

Как вы можете догадаться, по умолчанию эта утилита пытается уничтожить процесс:

<pre>kill <span class=“highlight”>PID_of_target_process</span></pre>

Она отправляет процессору сигнал TERM. Сигнал TERM просит процесс остановиться. Это позволяет программе выполнить операции по очистке и нормально завершить работу.

Если программа работает неправильно и не завершает работу после получения сигнала TERM, мы можем отправить сигнал более высокого уровня — :

<pre>kill -KILL <span class=“highlight”>PID_of_target_process</span></pre>

Это специальный сигнал, который не отправляется программе.

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

Каждому сигналу присвоено число, которое можно передать вместо имени. Например, вы можете передать “-15” вместо “-TERM” и “-9” вместо “-KILL”.

Использование сигналов для других целей

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

Например, многие демоны перезапускаются при получении сигнала или прекращения работы. Например, так работает Apache.

<pre>sudo kill -HUP <span class=“highlight”>pid_of_apache</span></pre>

Получив вышеуказанную команду, Apache перезагрузит файл конфигурации и возобновит вывод контента.

Вы можете вывести список сигналов, которые можно отправлять с помощью kill, используя следующую команду:

Отправка сигналов процессам по имени

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

Команда работает практически точно так же как и , но использует имя процесса:

Вышеуказанная команда эквивалентна команде:

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

Приведенная выше команда отправит сигнал TERM всем экземплярам firefox, запущенным на этом компьютере.

Используйте системный монитор, чтобы убить процесс в Linux

Следующий вариант – открыть утилиту System Monitor вашей операционной системы Linux. Обычно это находится в меню «Системные инструменты» и отображает список запущенных процессов на вкладке «Процессы».

Чтобы закрыть не отвечающее приложение, просто выберите его и щелкните правой кнопкой мыши. Затем у вас есть три варианта:

  • Остановить процесс: это приостанавливает процесс, позволяя продолжить его позже. Это не будет работать в большинстве случаев.
  • Завершение процесса: правильный способ закрыть процесс, это безопасно завершит работу приложения, удаляя временные файлы в пути.
  • Процесс уничтожения: это крайний вариант, и его следует использовать только в случае сбоя конечного процесса.

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

Завершение процесса и код завершения

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

По соглашению, код завершения служит признаком успешного завершения процесса, а ненулевое значение служит признаком возникновения какой-то ошибки. Большинство оболочек позволяют получить код завершения последней выполненной программы с по­мощью переменной оболочки по имени .

Использование процессора

Раздел использования ЦП показывает процент времени, затраченного ЦП на различные задачи. us Значение времени ЦП проводит выполняющиеся процессы в пользовательском пространстве. Точно так же sy значение — это время, потраченное на запуск процессов в пространстве ядра.

Linux использует «хорошее» значение для определения приоритета процесса. Процесс с высоким «хорошим» значением «приятнее» другим процессам и имеет низкий приоритет. Аналогично, процессы с более низким значением «nice» получают более высокий приоритет. Как мы увидим позже, «хорошее» значение по умолчанию может быть изменено. Время, затраченное на выполнение процессов с установленным вручную «nice», отображается в качестве niзначения.

Затем следует idвремя, в течение которого процессор остается бездействующим. Большинство операционных систем переводят ЦП в режим энергосбережения, когда он находится в режиме ожидания. Далее следует waзначение, которое время ЦП тратит на ожидание завершения ввода-вывода.

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

В виртуализированной среде часть ресурсов ЦП предоставляется каждой виртуальной машине (ВМ). ОС определяет, когда у нее есть работа, но она не может выполнить ее, потому что ЦП занят на другой виртуальной машине. Количество времени, потерянное таким образом, является временем «кражи», обозначенным как st.

Как происходит завершение процесса?

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

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

  • SIGINT — самый безобидный сигнал завершения, означает Interrupt. Он отправляется процессу, запущенному из терминала с помощью сочетания клавиш Ctrl+C. Процесс правильно завершает все свои действия и возвращает управление;
  • SIGQUIT — это еще один сигнал, который отправляется с помощью сочетания клавиш, программе, запущенной в терминале. Он сообщает ей что нужно завершиться и программа может выполнить корректное завершение или проигнорировать сигнал. В отличие от предыдущего, она генерирует дамп памяти. Сочетание клавиш Ctrl+/;
  • SIGHUP — сообщает процессу, что соединение с управляющим терминалом разорвано, отправляется, в основном, системой при разрыве соединения с интернетом;
  • SIGTERM — немедленно завершает процесс, но обрабатывается программой, поэтому позволяет ей завершить дочерние процессы и освободить все ресурсы;
  • SIGKILL — тоже немедленно завершает процесс, но, в отличие от предыдущего варианта, он не передается самому процессу, а обрабатывается ядром. Поэтому ресурсы и дочерние процессы остаются запущенными.

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

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

Сначала Ctrl+C, если это возможно, затем SIGTERM — он хоть и завершает процесс, но делает эту культурно, и только в крайнем случае SIGKILL. А теперь рассмотрим как убить процесс по pid Linux на практике. Если вы всегда используете SIGKILL, тогда на ум приходит такая картинка:

🏃💨 Subway Surfers — Official Launch Trailer

Subway Surfers — Official Launch Trailer

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

Ну, это случилось со всеми нами в какой-то момент, не так ли? Решение состоит в том, чтобы прекратить или убить процесс приложения. Но как?

К счастью, в Linux есть несколько утилит, которые позволяют убивать ошибочные процессы.

, мы покажем вам, как использовать команды , и для завершения процесса в Linux.

Основное различие между этими инструментами состоит в том, что завершает процессы на основе идентификатора процесса (PID), а команды и завершают запущенные процессы на основе их имен и других атрибутов.

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

Сигналы убийства системы

, и отправляют данный сигнал указанным процессам или группам процессов. Когда сигнал не указан, каждый инструмент отправляет ( ).

Наиболее часто используемые сигналы:

1 (-HUP): перезагрузить процесс. 9 (-KILL): убить процесс. 15 (-ТЕРМ): изящно остановить процесс.

Сигналы могут быть указаны тремя различными способами:

использование числа (например, -1) с префиксом «SIG» (например, -SIGHUP) без префикса «SIG» (например, -HUP).

Используйте опцию для отображения всех доступных сигналов:

Описанные ниже шаги будут работать на всех дистрибутивах Linux.

Завершение процессов с помощью команды

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

Допустим, браузер Firefox перестал отвечать на запросы, и вам нужно убить процесс Firefox. Чтобы найти идентификатор процесса, используйте команду :

Команда напечатает все процессы Firefox:

Как только вы узнаете, что Firefox обрабатывает PID для завершения, все они посылают сигнал :

Завершение процессов с помощью команды

Команда завершает все программы, которые соответствуют указанному имени.

Используя тот же сценарий, что и раньше, вы можете убить процесс Firefox, набрав:

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

Например, чтобы завершить все процессы, запущенные от имени пользователя «sara», вы должны выполнить следующую команду:

Завершение процессов с помощью команды

завершает процессы, которые соответствуют шаблону, указанному в командной строке:

Название процесса не должно быть точным совпадением.

С помощью вы также можете отправить сигнал процессам, которые принадлежат данному пользователю. Чтобы убить только процессы firefox, принадлежащие пользователю «sara», вы должны набрать:

Вывод

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

убить терминал

Net Neutrality — это хорошо, но чистый Net Neutrality может иметь недостаток, слишком .

Daphne — бесплатная замена диспетчера задач для Windows 8 | 7, что позволяет эффективно закрывать, убивать, контролировать, отлаживать процессы и процессы Windows.

Узнайте, как убивать программы, не отвечающие в Windows, из меню правого клика.

How to kill all processes by name?

You can also use the name of a running process, rather than the PID, with the pkill command. But beware, this will terminate all the processes running the under the specified name, since kill won’t know which specific process you are trying to terminate.

$ pkill name-of-process

Check out the example below, where we terminate five processes with a single pkill command.

In this example, we had wanted to only terminate one of those screen sessions; it would’ve been necessary to specify the PID and use the normal ‘kill’ command. Otherwise, there is no way to uniquely specify the process that we wish to end.

Что такое процессы в Linux

Итак, что тебе нужно знать о процессах? Только то что любой процесс — это исполняемая программа. На этом всё, можешь переходить к той части где я буду показывать как с ними работать. Но если всё же, хочется чуть больше теории, то читай дальше. По свой сути процесс это некое общее определение механизма позволяющего управлять памятью, временем работы процессора и ресурсами ввода-вывода. Соответственно процесс и программа в Linux — это синонимы. Ровно как и команда. Ведь когда ты вводишь в терминале команду, ты тем самым запускаешь соответствующую программу, а значит создаётся соответствующий процесс. Тут ещё можно понимать что пока программа не запущена, это программный файл. Отличается он от любого другого файла, только наличием бита доступа X, т.е. возможностью исполнения. Но как только мы его запустим, он станет процессом под управлением ядра Linux.

По поводу непосредственно запуска, нужно понимать что запускать программы из терминала можно либо вписав её название, либо полностью путь к исполняемому файлу. В случае с названием программа запустится если она есть в каталогах перечисленных в переменной окружения PATH.

Ну и соответственно если нужной программы в этих каталогах нет, то, для запуска, путь нужно вписывать полностью. Либо если запускаешь из каталога в котором сейчас находишься, то путь можно заменить точкой т.е.: ./имя_файла

Компоненты процесса

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

Идентификаторы процессов

Как ты наверняка понимаешь всяческих процессов в Linux довольно много. А с твоей помощью их будет становится только больше. И, логично предположить, что в них как-то нужно ориентироваться. Причём если для тебя это опциональный навык, то для самой системы жизненно необходимый. А соответственно в Linux существует немалое количество всяких идентификаторов процессов. И раз уж мы тут изучаем основы Linux, то знать где какой идентификатор и что он означает будет очень не лишним.

PID (Process ID) — уникальный идентификатор процесса, который назначается каждому процессу ядром. В большинстве случаев когда ты будешь работать с процессами, тебе нужно будет использовать именно его, для точного указания нужного процесса.

PPID (Parent Process ID) — тут фишка в том что в Linux для выполнения программы не создаётся новый процесс, а какой-то из существующих клонирует себя, а потом заменяет текущую выполняемую программу на новую. В этой истории исходный процесс принято называть родительским, а его клон дочерним. Естественно дочернему процессу присваивается собственный PID, но помимо этого он ещё и имеет атрибут PPID, который совпадает с идентификатором родительского процесса. Может такое случится что родительский процесс будет завершен раньше дочернего. Это не означает что все дочерние процессы тут же отвалятся, нет, в этой ситуации демон systemd подставит себя на место родительского процесса. Демон systemd это первая программа запускаемая после загрузки ядра, соответственно всегда имеет идентификатор 1. (более подробно про это всё расскажу когда будем рассматривать жизненный цикл процесса)

Тут нужно заметить, дабы не провоцировать агрессию красноглазых, что я упоминаю именно systemd в качестве подсистемы инициализации, только потому, что примеры буду показывать в Ubuntu. В других дистрибутивах может быть демон init, или какой-то другой в зависимости от эксклюзивности дистрибутива

UID (User ID) — это идентификатор пользователя создавшего процесс. Тут нужно знать только то что менять атрибуты процесса могут только его создатель и суперпользователь.

GID (Group ID) — это идентификатор группы к которой принадлежит владелец процесса.

Находим 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:

Команда killall

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

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

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

killall shutt
killall shutter

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

  • s (секунды)
  • m (минуты)
  • h (часы)
  • d (дни)
  • w (недели)
  • M (месяцы, примечание, заглавная «М»)
  • y (годы)

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

killall -y 2m ana

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

killall -o 1d sshd

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

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

Killing a process

There are various commands you can use to kill a process — , ,  and . We will begin from the simplest one: the  command.

Killing processes with the killall command

The command is one of the easiest ways to kill a process. If you know the exact name of a process, and you know that it’s not running as another user and it is not in the Z or D states, then you can use this command directly; there’s no need to manually locate the process as we described above.

By default,  For example, to kill a process named “firefox”, run:

killall firefox

To forcibly kill the process with SIGKILL, run:

killall -9 firefox

You can also use  instead of .

If you want to kill processes interactively, you can use  like so:

killall -i firefox

If you want to kill a process running as a different user, you can use :

sudo killall firefox

You can also kill a process that has been running for a certain period of time with the  and flags. So, if you want to kill a process that has been running for more than 30 minutes, use:

killall -o 30m <process-name>

If you want to kill a process that has been running for less than 30 minutes, use:

killall -y 30m <process-name>

Similarly, use the following abbreviations for the respective units of time:

s seconds
m minutes
h hours
d days
w weeks
M months
y years

Killing processes with the pkill command

Sometimes, you only know part of a program’s name. Just like ,  allows you to kill processes based on partial matches. For example, if you want to kill all processes containing the name  in the name, run:

pkill apache

If you want to use a SIGKILL instead of a SIGTERM, use:

pkill -9 apache

Again, you can also use  instead of .

Killing processes with the kill command

Using the kill command is straightforward. Once you have found out the PID of the process that you want to kill, you can terminate it using the  command. For example, if you want to kill a process having a PID of 1234, then use the following command:

kill 1234

As we mentioned previously, the default is to use a SIGTERM. To use a SIGKILL, use  or  as we have seen before:

kill -9 1234

Killing processes with the top command

It is very easy to kill processes using the  command. First, search for the process that you want to kill and note the PID. Then, press  while top is running (this is case sensitive). It will prompt you to enter the PID of the process that you want to kill.

After you enter the PID, press enter. Now it will ask which signal you want to use to kill the process. If you want to use SIGTERM(15), then simply press enter as it is the default signal. If you want to use SIGKILL(9), then type 9 and press enter.

If you leave the process ID blank and hit enter directly, it will terminate the topmost process in the list. You can scroll using the arrow keys, and change the process you want to kill in this way.

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
IP-файл
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: