Не убивается процесс Linux
Во время использования операционной системы Linux возникают ситуации, при которых процессы зависают и вы не можете их завершить. Например, вы хотите закрыть графическую программу или сервис, отправляете сигнал TERM, что в переводе означает завершить, а программа не реагирует на него.
Дело в том, что для того, чтобы программа могла завершится с помощью сигнала TERM, она должна быть в рабочем состоянии. Это сигнал просит программу завершится. Если программа зависла, она может попросту не получить ваш сигнал. Или программа может его обработать но не завершатся, этот сигнал носит рекомендательный характер. Вот возможные причины и варианты решения:
- Недостаточно прав — вы не можете убить процесс, запущенный от имени другого пользователя, используйте sudo;
- Программа зависла — необходимо ей послать сигнал KILL;
- Программа стала зомби — необходимо уничтожить её родительский процесс.
- Программа ждет ответа от драйвера — ждать или перезапустить компьютер.
В любом случае сначала пробуем от имени суперпользователя:
sudo kill -KILL идентификатор_процесса
Сначала можно попробовать завершить программу с помощью сигнала KILL, для этого передайте -KILL или -9 в виде опции утилите kill:
kill -KILL идентификатор_процесса
Если это не работает, можно попробовать посмотреть родительский процесс программы с помощью утилиты ps:
ps -xal | grep идентификатор_процесса
А затем его уничтожить. Подробнее об этом читайте в статье зомби процессы Linux. Последний возможный вариант — программа находится в состоянии TASK_UNITERRUPTIBLE. В это состояние программа, когда она ожидает ответа от драйвера. Например, драйвера оборудования или файловой системы. Обычно, когда драйвер отрабатывает, программа становится обычной, но при ошибках в драйверах программа может остаться в этом состоянии навсегда. Убить её нельзя, можно только перезагрузкой компьютера.
Убиваем процессы в Linux — команды ps, kill и killall
Под процессом мы будем понимать запущенную в системе копию программы. Например, если вы открыли три окна калькулятора (например, gcalctool), это значит, что вы запустили три процесса.
Находим 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:
«Убиваем» процесс командой kill
Когда известен PID процесса, мы можем убить его командой kill. Команда kill принимает в качестве параметра PID процесса. Например, убьем процесс с номером 25609:
Вообще команда kill предназначена для посылки сигнала процессу. По умолчанию, если мы не указываем какой сигнал посылать, посылается сигнал SIGTERM (от слова termination — завершение). SIGTERM указывает процессу на то, что необходимо завершиться. Каждый сигнал имеет свой номер. SIGTERM имеет номер 15. Список всех сигналов (и их номеров), которые может послать команда kill, можно вывести, выполнив kill -l. Чтобы послать сигнал SIGKILL (он имеет номер 9) процессу 25609, выполните в командой строке:
Сигнал SIGTERM может и не остановить процесс (например, при перехвате или блокировке сигнала), SIGKILL же выполняет уничтожение процесса всегда, так как его нельзя перехватить или проигнорировать.
Убиваем процессы командой killall
Команда killall в Linux предназначена для «убийства» всех процессов, имеющих одно и то же имя. Это удобно, так как нам не нужно знать PID процесса. Например, мы хотим закрыть все процессы с именем gcalctool. Выполните в терминале:
Команда killall, также как и kill, по умолчанию шлет сигнал SIGTERM. Чтобы послать другой сигнал нужно воспользоваться опцией -s. Например:
Заключение
Некоторые процессы не удается остановить под обычным пользователем. Например, если процесс был запущен от имени пользователя root или от имени другого пользователя системы, то команды kill и killall нужно выполнять от имени суперпользователя, добавляя sudo (в Ubuntu):
Бывают ситуации, когда вы работаете в графическом интерфейсе (например, GNOME) и вам не удается открыть эмулятор терминала, чтобы остановить зависший процесс. Тогда можно переключиться на виртуальную консоль клавишами Ctrl+Alt+F1, залогиниться в ней и выполнять команды уже из нее. А потом перейти обратно, нажав Ctrl+Alt+F7.
Справку по использованию любой команды можно получить командой man:
Как убить процесс? kill -9 не работает.
Есть процесс. Жрет 100% CPU и продолжает выделять память. Его надо убить.
Пробовал всё сигналы которые только есть. и kill -KILL, kill -INT, kill -ABRT, kill -TERM .
И вручную вызывая kill и через htop.
после renice +19 — стал меньше жрать CPU. Но так и не убился — продолжал ратотать.
Тогда я закрыл — терминал (xterm) в котором запустил этот процесс. Не помогло.
Рестартанул иксы — не помогло.
Ребутнул машину — помогло (минут 10 шатдаунился, вместо положених нескольких секунд).
Как. Как убить процесс? Гарантировано? Чтоб он умер?
Re: Как убить процесс? kill -9 не работает.
процесс кому принадлежит? Убиваешь из под кого? У меня было и не раз, что только рутом убивался.
Re: Как убить процесс? kill -9 не работает.
Re: Как убить процесс? kill -9 не работает.
>процесс кому принадлежит?
Юзерский. Убивал и из под юзера и через sudo.
Re: Как убить процесс? kill -9 не работает.
>лопатой
$ sudo apt-get install лопата
E: Couldn’t find package лопата
А точнее)
Re: Как убить процесс? kill -9 не работает.
я такое один раз видел. Причины остались невыяснеными.
Re: Как убить процесс? kill -9 не работает.
sensor что говорят. Так ничего у вас не греется часом. Или оный процесс не висит случайно в попытке read 3 на недоступный ресурс?
Re: Как убить процесс? kill -9 не работает.
> Как убить процесс? Гарантировано? Чтоб он умер?
Никак. Есть ситуации, при которых процессы не умирают. Обычно это связано с неправильным функционированием железа в сочетании с кривыми драйверами. Распознается по нахождению процесса в состоянии D.
Re: Как убить процесс? kill -9 не работает.
Покажи дерево процессов, относящихся к твоему живчику.
Re: Как убить процесс? kill -9 не работает.
Re: Как убить процесс? kill -9 не работает.
Re: Как убить процесс? kill -9 не работает.
Re: Как убить процесс? kill -9 не работает.
> Странно. Что вообще никак?
С гарантией — никак. В 99.99% случаев kill -9 в конце концов доходит до процесса, но иногда. Есть такое состояние процесса — TASK_UNITERRUPTIBLE, оно часто используется в драйверах при ожидании завершения В/В, и в нем процесс не реагирует на сигналы. Халтурно сделанные драйверы не взводят при этом тайм-аут, и потенциально процесс может остаться вечным и неубиваемым. Такое бывает еще и при внезапно отвалившихся ФС (сетевых или локальных — без разницы). Однако то, что у тебя процесс «чистый» (без В/В), и при этом не убивается — странно. В логах что-нибудь есть?
> ghisguth 12911 5.1 68.7 21782180 1400096 pts/7 Dl+ 00:15 0:16 ./test -asegfault2 —int1=500
Попробуй убивать его из-под рута.
Какая версия ядра? Какой дистр?
Re: Как убить процесс? kill -9 не работает.
>С гарантией — никак. В 99.99% случаев kill -9 в конце концов доходит до процесса, но иногда.
Теперь вроди как понятно почему нет реакции на kill (D == Uninterruptible sleep == TASK_UNITERRUPTIBLE). Но почему он стал таким — не совсем ячно. Единственная задача программы упасть попортив стек в потоках.
>Попробуй убивать его из-под рута.
Пробовал — ноль реакции. По идее чтоб остановить такой процесс — надо в самом ядре изменить статус задачи. Может можно это сделать через /proc/ интерфейс?
>Какая версия ядра?
Linux x61s 2.6.24-17-generic #1 SMP Thu May 1 13:57:17 UTC 2008 x86_64 GNU/Linux
>Какой дистр?
Ubuntu 8.04
Re: Как убить процесс? kill -9 не работает.
> Но почему он стал таким — не совсем ячно.
> Может можно это сделать через /proc/ интерфейс?
Я бы попробовал ванильное 2.6.24.7 или 2.6.25.4
Re: Как убить процесс? kill -9 не работает.
А нельзя ли запустить снова через strace и посмотреть, что именно за ввод-вывод он в это время делает?
И я правильно понял, что время он кушает именно в ядре? (/usr/bin/top покажет как %sy)
Re: Как убить процесс? kill -9 не работает.
Если оно в ядре — ему может быть пофиг на киллы. Возможно либо кривое железо, либо криво собранное ядро, либо просто бага в ядре.
Re: Как убить процесс? kill -9 не работает.
У меня какое-то смутное подозрение, что процесс, который специально затирает свою память, может не реагировать на kill’ы, примерно как циклоп в выколотым глазом может не оценить искусства Марселя Марсо.
Re: Как убить процесс? kill -9 не работает.
> процесс [. ] может не реагировать на kill’ы
kill -9 неотменяемый и неперехватываемый. И не реагировать на kill он может только если ждет чего-то в ядерной функции.
Re: Как убить процесс? kill -9 не работает.
> И не реагировать на kill он может только.
я правильно понимаю, это ядро его должно прибить, а не он сам «сдохнуть», да? т.е. сигнал, он через ядро передается, да?
Re: Как убить процесс? kill -9 не работает.
> kill -9 неотменяемый и неперехватываемый.
> И не реагировать на kill он может только если ждет чего-то в ядерной функции.
После того, как стек переписан рэндомными байтами, поведение процесса становится непредсказуемым. Что значит — реагирует-не реагирует, если у него вместо реагировалки написаны цифры числа пи после миллионного знака?
Re: Как убить процесс? kill -9 не работает.
Вопрос решен. Всё оказалось достаточно просто;)
Проблема заключалась в следующем:
1. при записи рандомных значений в стек — падение происходит не с одинаковыми интервалами времени. Тоесть программа работает до сегфолта затирая память иногда секунды 3-5, а иногда 20-30.
2. Чем раньше случился сегфолт — тем меньше стартовало потоков и меньше памяти было затерто.
3. генерация коры проходит быстро если сегфолт произошел в течении 1-10 секунд. Если программа проработала достаточно долго — то генерация коры может длится до 5 минут (у меня стоит большое ограничение на размер коры и пока ядро запишет всю инфу которую хочет — например всю память которую подпортила програма — проходит много времени).
4. Соответственно ядро производит дамп коры и в этот момент его прервать нельзя.
Всем спасибо за помощь.
Re: Как убить процесс? kill -9 не работает.
> После того, как стек переписан рэндомными байтами
Передачей сигналов ведает ЯДРО.
Сигнал kill приводит к жестокому и стремительному «выносу» процесса из таблицы процессов. С освобождением всех его ресурсов — в том числе страниц стека, файловых дескрипторов, mmap и прочим. И ядро при выносе задачи не смотрит на то что у нее там написано в юзерспейсе.
Состояние процесса (спит, ждет завершения операции в ядре, выполняется и прочее) записаны во внутренних таблицах ядра, и задача к ним доступа не имеет, поэтому пусть она все что захочет себе куда угодно пишет.
P.S.: и раздачей сигналf родительскому процессу о том, что дочерний процесс был прибит, также ведает ядро, если что.
> если у него вместо реагировалки написаны цифры
Еще раз, man signal: < The signals SIGKILL and SIGSTOP cannot be caught or ignored>. Эти сигналы обрабатываются целиком ядром, на основании его внутренних структур, и до процесса не доводятся. И что там процесс попытался навесить на эти сигналы, никого не колебет.
Re: Как убить процесс? kill -9 не работает.
> это ядро его должно прибить, а не он сам «сдохнуть», да?
Да. SIGTERM передается процессу, чтобы он умер сам (император приказал совершить сеппуку). SIGKILL отрабатывается ядром (император послал наемного убийцу).
Re: Как убить процесс? kill -9 не работает.
Я так делаю,
сначала вот:
ps aux | grep -i «примерное_название_головного_исполн_файла»
например mplayer
Потом точнее:
sudo killall mplayer
Re: Как убить процесс? kill -9 не работает.
> Да. SIGTERM передается процессу, чтобы он умер сам (император приказал совершить сеппуку). SIGKILL отрабатывается ядром (император послал наемного убийцу).