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


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


Предупреждение : смена PID - нестандартный процесс, и при определенных обстоятельствах может привести к панике ядра.

Наш тестовый модуль будет реализовывать символьное устройство /dev/test, при чтении с которого процессу будет изменен PID. За пример реализации символьного устройства спасибо этой статье. Полный код модуля приведен в конце статьи. Конечно, самым правильным решением было добавить системный вызов в само ядро, однако это потребует перекомпиляцию ядра.

Окружение

Все действия по тестированию модуля выполнялись в виртуальной машине VirtualBox с 64 битным дистрибутивомLInux и версией ядра 4.14.4-1. Связь с машиной осуществлялась с помощью SSH.

Попытка #1 простое решение

Пару слов о current : переменная current указывает на структуру task_struct с описанием процесса в ядре(PID, UID, GID, cmdline, namespaces и т.д)

Первой идеей было просто поменять параметр current->pid из модуля ядра на нужный.

Static ssize_t device_read(struct file *filp, char *buffer, size_t length, loff_t * offset) { printk("PID: %d.\n",current->pid); current->pid = 1; printk("new PID: %d.\n",current->pid); , }
Для проверки работоспособности модуля я написал программу на C++:

#include #include #include int main() { std::cout << "My parent PID " << getppid() << std::endl; std::cout << "My PID " << getpid() << std::endl; std::fstream f("/dev/test",std::ios_base::in); if(!f) { std::cout << "f error"; return -1; } std::string str; f >> str; std::cout << "My new PID " << getpid() << std::endl; execl("/bin/bash","/bin/bash",NULL); }
Загрузим модуль коммандой insmod, создадим /dev/test и попробуем.

# ./a.out My parent PID 293 My PID 782 My new PID 782
PID не изменился. Возможно, это не единственное место, где указывается PID.

Попытка #2 дополнительные поля PID

Если не current->pid является идентификатором процесса, то что является? Быстрый просмотр кода getpid() навел на структуру task_struct , описывающую процесс Linux и файл pid.c в исходном коде ядра. Нужная функция - __task_pid_nr_ns. В коде функции встречается обращение task->pids.pid, этот параметр мы и изменим

Компилируем, пробуем

Так как тестировал я по SSH, мне удалось получить вывод программы до падения ядра:

My parent PID 293 My PID 1689 My new PID 1689
Первый результат, уже что-то. Но PID все равно не изменился.

Попытка #3 не экспортируемые символы ядра

Более внимательное изучение pid.c дало функцию, которая делает то, что нам нужно
static void __change_pid(struct task_struct *task, enum pid_type type,
struct pid *new)
Функция принимает задачу, для которой надо изменить PID, тип PID и, собственно, новый PID. Созданием нового PID занимается функция
struct pid *alloc_pid(struct pid_namespace *ns)

Эта функция принимает только пространство имен, в котором будет находиться новый PID, это пространство можно получить с помощью task_active_pid_ns .
Но есть одна проблема: эти символы ядра не экспортируются ядром и не могут использоваться в модулях. В решении этой проблемы мне помогла замечательная . Код функции find_sym взят оттуда.

Static asmlinkage void (*change_pidR)(struct task_struct *task, enum pid_type type, struct pid *pid); static asmlinkage struct pid* (*alloc_pidR)(struct pid_namespace *ns); static int __init test_init(void) { printk(KERN_ALERT "TEST driver loaded!\n"); change_pidR = find_sym("change_pid"); alloc_pidR = find_sym("alloc_pid"); ... } static ssize_t device_read(struct file *filp, char *buffer, size_t length, loff_t * offset) { printk("PID: %d.\n",current->pid); struct pid* newpid; newpid = alloc_pidR(task_active_pid_ns(current)); change_pidR(current,PIDTYPE_PID,newpid); printk("new PID: %d.\n",current->pid); ... }
Комплируем, запускаем

My parent PID 299 My PID 750 My new PID 751
PID изменен! Ядро автоматически выделило нашей программе свободный PID. Но можно ли использовать PID, который занял другой процесс, например PID 1? Добавим после аллокации код

Newpid->numbers.nr = 1;
Комплируем, запускаем

My parent PID 314 My PID 1172 My new PID 1
Получаем настоящий PID 1!

Bash выдал ошибку, из-за которой не будет работать переключение задач по комманде %n, но все остальные функции работают отлично.

Интересные особенности процессов с измененным PID

PID 0: войти нельзя выйти

Вернемся к коду и изменим PID на 0.

Newpid->numbers.nr = 0;
Комплируем, запускаем

My parent PID284 My PID 1517 My new PID 0
Выходит PID 0 не такой и особенный? Радуемся, пишм exit и…

Ядро падает! Ядро определило нашу задачу как IDLE TASK и, увидев завершение, просто упало. Видимо, перед завершением наша программа должна вернуть себе «нормальный» PID.

Процесс-невидимка

Вернемся к коду и выставим PID, гарантированно не занятый
newpid->numbers.nr = 12345;

Комплируем, запускаем

My parent PID296 My PID 735 My new PID 12345
Посмотрим, что находится в /proc

1 148 19 224 288 37 79 86 93 consoles fb kcore locks partitions swaps version 10 149 2 226 29 4 8 87 acpi cpuinfo filesystems key-users meminfo sched_debug sys vmallocinfo 102 15 20 23 290 5 80 88 asound crypto fs keys misc schedstat sysrq-trigger vmstat 11 16 208 24 291 6 81 89 buddyinfo devices interrupts kmsg modules scsi sysvipc zoneinfo 12 17 21 25 296 7 82 9 bus diskstats iomem kpagecgroup mounts self thread-self 13 176 210 26 3 737 83 90 cgroups dma ioports kpagecount mtrr slabinfo timer_list 139 18 22 27 30 76 84 91 cmdline driver irq kpageflags net softirqs tty 14 182 222 28 31 78 85 92 config.gz execdomains kallsyms loadavg pagetypeinfo stat uptime
Как видим /proc не определяет наш процесс, даже если мы заняли свободный PID. Предыдущего PID тоже нет в /proc, и это весьма странно. Возможно, мы находимся в другом пространстве имен и поэтому не видны основному /proc. Смонтируем новый /proc, и посмотрим что там

1 14 18 210 25 291 738 81 9 bus devices fs key-users locks pagetypeinfo softirqs timer_list 10 148 182 22 26 296 741 82 90 cgroups diskstats interrupts keys meminfo partitions stat tty 102 149 19 222 27 30 76 83 92 cmdline dma iomem kmsg misc sched_debug swaps uptime 11 15 2 224 28 37 78 84 93 config.gz driver ioports kpagecgroup modules schedstat sys version 12 16 20 226 288 4 79 85 acpi consoles execdomains irq kpagecount mounts scsi sysrq-trigger vmallocinfo 13 17 208 23 29 6 8 86 asound cpuinfo fb kallsyms kpageflags mtrr self sysvipc vmstat 139 176 21 24 290 7 80 87 buddyinfo crypto filesystems kcore loadavg net slabinfo thread-self zoneinfo
По прежнему нашего процесса нет, а значит мы в обычном пространстве имен. Проверим

Ps -e | grep bash
296 pts/0 00:00:00 bash

Только один bash, с которого мы и запускали программу. Ни предыдущего PID, ни текущего в списке нет.

Операционная система UNIX Робачевский Андрей М.

Идентификатор процесса Process ID (PID)

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

Данный текст является ознакомительным фрагментом. Из книги Архитектура операционной системы UNIX автора Бах Морис Дж

4.4 ПРЕВРАЩЕНИЕ СОСТАВНОГО ИМЕНИ ФАЙЛА (ПУТИ ПОИСКА) В ИДЕНТИФИКАТОР ИНДЕКСА Начальное обращение к файлу производится по его составному имени (имени пути поиска), как в командах open, chdir (изменить каталог) или link. Поскольку внутри системы ядро работает с индексами, а не с

Из книги Редкая профессия автора Зуев Евгений

Что такое идентификатор? Помимо неоднозначностей в синтаксисе быстро обнаружились другие неприятности. На примерах их показать сложнее, так что придется рассказывать словами.Синтаксис языка Си++ неудобен еще и в другом отношении. Если говорить коротко, то прямое

Из книги Программирование автора Козлова Ирина Сергеевна

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

Из книги 200 лучших программ для Интернета. Популярный самоучитель автора Краинский И

Process Guardian ХР Производитель: T.A.S. Independent Programming (http://www.tas-independent-programming.com).Статус: бесплатная.Ссылка для скачивания: http://www.tas-independent-programming.com/cgi-bin/countdown.pl?Guardian.exe.Размер: 2,4 Мбайт.Главное предназначение этой утилиты – управлять запущенными на компьютере процессами.После

Из книги Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT автора Фролов Александр Вячеславович

Идентификатор открытого файла В состав класса CFile входит элемент данных m_hFile типа UINT. В нем хранится идентификатор открытого файла. Если вы создали объект класса CFile, но еще не открыли никакого файла, то в m_hFile записана константа hFileNull.Обычно нет необходимости

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

Идентификатор транзакций Другая часть стратегии тайм-аутов и повторных передач заключается в использовании идентификаторов транзакций (transaction ID или XID) для распознавания запросов клиента и ответов сервера. Когда клиент вызывает функцию RPC, библиотека присваивает этому

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

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

Из книги Adobe Audition 3 учебник автора Автор неизвестен

Dynamic EQ (process) Эффект Dynamic EQ варьирует количество фильтрации со временем. Например, в первой половине волны вы можете поднять высокие частоты, а во второй - изменить ширину затрагиваемой полосы частот. Окно Dynamic EQ имеет три вкладки: Gain, Frequency, и Q (bandwidth). 1. Frequency graph (график

Из книги Справочник по PHP автора

Pan/Expander (process) Эффект Pan/Expand позволяет переместить центральный канал (моно составляющую) из стерео сигнала, а также расширить или сузить стерео разделение левого и правого каналов.Центральный канал панорамируется используя центральный и окружающие каналы стерео записи,

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

Stretch (process) Эффект Stretch позволяет изменять высоту тона (питч) звукового сигнала, темп или то и другое. Например, вы можете использовать этот эффект, чтобы увеличить высоту тона фонограммы без изменения ее длительности, или же наоборот изменить длительность не изменяя

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

Идентификатор сессии Итак, идентификатор сессии является именем временного хранилища, которое будет использовано для хранения данных сессии между запусками сценария. Один SID - одно хранилище. Нет SID, нет и хранилища, и наоборот.Так как же соотносится идентификатор и имя

Из книги Операционная система UNIX автора Робачевский Андрей М.

10.2.1. Идентификатор процесса и происхождение Два из наиболее фундаментальных атрибутов - это идентификатор процесса (process ID), или pid, а также идентификатор его родительского процесса. Идентификатор pid - это положительное целое число, которое уникально идентифицирует

Из книги автора

10.2.3. Идентификатор uid файловой системы В очень специальных случаях программе может понадобиться сохранять свои права root для всего, кроме доступа к файловой системе, при котором она использует пользовательский uid. Изначально использовавшийся в Linux NFS-сервер пространства

Из книги автора

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

Из книги автора

Из книги автора

Идентификатор родительского процесса Parent Process ID (PPID) Идентификатор процесса, породившего данный


Не смотря на свою стабильность, некоторые приложения в Linux иногда виснут. Иногда приложения перестают отзываться или просто работают так медленно, что корректно закрыть их не получается. Один из способов «убить», запущенное приложение в Linux, это использование таких команд, как kill или killall. Рассмотрим, как использовать эти команды, находить PID процесса и посылать сигнал SIGKILL.

Под процессом мы будем понимать запущенную в системе копию программы. Например, если вы открыли три окна калькулятора (например, gcalctool), это значит, что вы запустили три процесса.

Находим PID зависшего процесса

Каждый процесс в Linux имеет свой идентификатор, называемый PID. Перед тем, как выполнить остановку процесса, нужно определить его PID. Для этого воспользуемся командами ps и grep. Команда ps предназначена для вывода списка активных процессов в системе и информации о них. Команда grep запускается одновременно с ps (в канале) и будет выполнять поиск по результатам команды ps. Вывести список всех процессов можно, выполнив в командной строке:

Но, как правило, список очень большой и найти процесс, который мы хотим «убить», бывает не так просто. Здесь на помощь приходит команда grep. Например, чтобы найти информацию о процессе с именем gcalctool выполните команду:

Ps axu | grep gcalctool

Команда grep выполнит поиск по результатам команды ps и на экран будут выведены только те строки, которые содержат строку (слово) gcalctool. Здесь есть одна интересная деталь, например, если у вас не запущено приложение gcalctool, то после выполнения ps axu | grep gcalctool вы получите:

$ ps axu | grep gcalctool yuriy 25587 0.0 0.0 10636 884 pts/2 S+ 10:20 0:00 grep --color=auto gcalctool

То есть мы получили сам процесс grep, так как в качестве параметра команде мы указали слово gcalctool, и grep нашел сам себя в выводе команды ps .

Если процесс gcalctool запущен, то мы получим:

Yuriy@yuriy-NIX:~$ ps axu | grep gcalctool yuriy 25609 7.6 0.4 500840 17964 ? Sl 10:20 0:00 gcalctool yuriy 25624 0.0 0.0 10640 884 pts/2 S+ 10:21 0:00 grep --color=auto gcalctool

Здесь нас интересует строка: «yuriy 25609 7.6 0.4 500840 17964 ? Sl 10:20 0:00 gcalctool ». Число 25609 и есть идентификатор (PID) процесса gcalctool.

Есть еще один более простой способ узнать PID процесса — это команда pidof , которая принимает в качестве параметра название процесса и выводит его PID. Пример выполнения команды pidof:

$ pidof gcalctool 25609

«Убиваем» процесс командой kill

Когда известен PID процесса, мы можем убить его командой kill . Команда kill принимает в качестве параметра PID процесса. Например, убьем процесс с номером 25609:

Kill 25609

Вообще команда kill предназначена для посылки сигнала процессу. По умолчанию, если мы не указываем какой сигнал посылать, посылается сигнал SIGTERM (от слова termination — завершение). SIGTERM указывает процессу на то, что необходимо завершиться. Каждый сигнал имеет свой номер. SIGTERM имеет номер 15. Список всех сигналов (и их номеров), которые может послать команда kill, можно вывести, выполнив kill -l . Чтобы послать сигнал SIGKILL (он имеет номер 9) процессу 25609, выполните в командой строке:

Kill -9 25609

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

Убиваем процессы командой killall

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

Killall gcalctool

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

Killall -s 9 gcalctool

Заключение

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

Sudo kill 123

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

Справку по использованию любой команды можно получить командой man:

Man ps man grep man pidof man kill man killall

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

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

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

При работе с Ubuntu Linux у вас вероятно уже возникали вопросы:

Как определить PID чтобы в последующем убить процесс / приложение

Если вы не хотите запускать команду top или же другой более мощный ее аналог htop , далее утруждать себя поисками айди того или иного айди процесса, есть более простой выход / решение, чтобы найти PID процесса можно использовать команду "pidof " или "PS ".

Допустим нам нужно узнать айди процесса приложения Google Chrome, что мы делаем в данной ситуации, откройте терминал Ctrl + Alt + T и выполняем в терминале команду:

Pidof chrome

получаем вывод:

9497 9183 9123 8815 8788 6042 6033 5938 5916 5911 5908 5900 5892 5836 5831 5819

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

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

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

Sudo kill 9497 9183 9123 8815 8788 6042 6033 5938 5916 5911 5908 5900 5892 5836 5831 5819

так же вы можете в системе посмотреть все активные процессы выполнив команду:

Sudo ps axu

да, вот так просто. Вместо Chrome может быть любое другое приложение, skype или еще какое другое.

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

Ps -A | grep -i name-app

вместо name-app пишем название приложения, не вводите полное название вручную, используйте автоопределение с помощью клавиш "TAB ". В итоге эта команда выведет время работы необходимого процесса и соответственно его PID , который вы можете использовать чтобы убить, давайте проверим работу команды выполним в терминале:

Ps -A | grep -i skype

получаем следующий результат:

9257 ? 00:00:57 skype

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

Как использовать команду Kill в Linux

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

Айди получили и можем теперь убить приложение:

Sudo kill 9257

вот и все, приложение убито.

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

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

Sudo killall skype

так же вариант:

Sudo killall -s 9 skype

в тот же миг приложение прекращает свою работу, вот так легко можно убить неугодные вам процессы.

Команда смерти, что не стоит выполнять в терминале

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

Приведу пример команды смерти:

Sudo kill -9 -1

это команда убьет все запущенные на данный момент процессы. Не советовал бы ее выполнять так как последствия могут быть непредсказуемые и вероятней всего придется перезапускать систему без графического интерфейса. На случай вдруг откажет графический интерфейс, тогда открываем терминал с помощью команд CTRL+ALT+F1 , каждое новое окно открывается по той же аналогии просто меняется F1 уже на F2 и так далее.

Получить справку по командам которые использовались выше, вы так же можете через терминал выполнив команды:

Man ps man grep man pidof man kill man killall

На этом наш краткий материал окончен, если вам что-то не понятно, спрашивайте в комментариях к материалу ниже.

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

В этой статье мы рассмотрим несколько самых распространенных способов завершить процесс Linux. Опишем подробно как происходит остановка процесса и как все сделать правильно.

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

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

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

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

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

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

Для передачи сигналов процессам в Linux используется утилита kill. Ее синтаксис очень прост:

$ kill -сигнал pid_процесса

Сигнал представляет собой один из выше перечисленных сигналов для завершения процесса. По умолчанию, если этот параметр не указан, используется сигнал SIGTERM, что является очень правильно. Также нам нужно указать какой процесс нужно завершить. Для этого используется уникальный идентификатор процесса - PID.

Допустим, у нас выполняется утилита ping. Мы хотим ее завершить с помощью kill. Тогда, сначала мы узнаем ее идентификатор с помощью команды ps:

ps aux | grep ping

В первой строчке отобразится сама утилита ping, а во второй сама программа ps. Берем нужный PID и завершаем процесс с помощью SIGTERM:

kill -TERM 20446

И только если после этой команды процесс продолжил висеть, а это вы можете проверить, выполнив ps. Только теперь можно выполнить SIGKILL:

kill -KILL 20446

Теперь снова проверяем:

Если процесс запущен от суперпользователя, то, естественно, вам нужно использовать sudo. Не всегда удобно уничтожать процесс по его PID, как минимум, потому, что вам этот PID нужно еще узнать. Мы могли бы нагородить сложных конструкций с использованием xargs, чтобы вычислять автоматически pid по имени процесса и сразу же его завершать, но в этом нет необходимости. Уже существуют специальные утилиты.

Как завершить процесс с помощью pkill

Утилита pkill - это оболочка для kill, она ведет себя точно так же, и имеет тот же синтаксис, только в качестве идентификатора процесса ей нужно передать его имя. Утилита сканирует директорию proc и находит PID первого процесса с таким именем, затем отправляет ему SIGTERM. Таким образом, вы можете убить процесс по имени Linux. Например, если мы хотим завершить тот же ping:

Также можно вручную задать тип сигнала:

pkill -TERM ping

Вместо ps, вы можете использовать утилиту pgrep для поиска pid процесса, убедимся что наша программа завершена:

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

Как остановить процесс с помощью killall

killall работает аналогично двум предыдущим утилитам. Она тоже приминает имя процесса в качестве параметра и ищет его PID в директории /proc. Но эта утилита обнаружит все процессы, с таким именем и завершит их. Например:

Как видите, запущено несколько процессов, осталось остановить процесс Linux с помощью killall:

Команда завершит все запущенные утилиты ping, вы можете убедиться в этом еще раз выполнив pgrep:

Выводы

В этой статье мы рассмотрели как убить процесс Linux. Иногда эта задача может быть очень полезной, но важно понимать, что ее нужно выполнять правильно. Нельзя сказать, что передача SIGKILL вместо SIGTERM очень опасна, но так делать не стоит. Надеюсь, эта информация была полезна для вас.