- Почему команда kill не убивает процесс?
- Не убивается процесс Linux
- Не убивается процесс Linux
- не убивается процесс
- Подскажите, пожалуйста, что можно сделать
- Как убить процесс Linux
- Как происходит завершение процесса?
- Как убить процесс Linux?
- Как завершить процесс с помощью pkill
- Как остановить процесс с помощью killall
- Выводы
Почему команда kill не убивает процесс?
Команда kill используется для того, чтобы остановить работу процесса, синтаксис команды:
Вы можете столкнуться с ситуацией, когда использование kill не приводит к завершению процесса.
Получить идентификатор процесса зная имя исполнимого файла можно командой:
Этой же командой можно проверять, работает ли ещё процесс.
Обычно достаточно команды kill для остановки большинства процессов. Но может быть так, что какой-то процесс совершенно не реагирует на kill, в том числе если запустить её с sudo.
Название команды kill продолжает вводить в заблуждение многих, многих пользователей (включая меня в начале). Предполагается, что когда вы говорите «kill X», это означает действительно убить X и больше ничего не делать. Но на самом деле это далеко не так. Команда kill всего лишь посылает процессору один из сигналов.
Если kill вызывается без каких-либо параметров, он отправляет сигнал номер 15 (SIGTERM). Этот сигнал может игнорироваться процессом. Этот сигнал уведомляет о необходимости привести в порядок свои вещи, а затем процесс сам правильно завершает работу. Это хороший способ.
Вы также можете «послать» сигнал номер 9 (SIGKILL), который процесс не может игнорировать. Процесс даже не распознает его, потому что ядро завершает процесс, а не сам процесс. Это злой путь.
Процессы могут игнорировать некоторые сигналы. Если вы отправите SIGKILL, он не сможет его игнорировать и не выполнит подготовительные для завершения действия, например, сохранение данных или очистку.
Если вы приостановите процесс с помощью CTRL-z, он будет блокировать большинство сигналов, пока он приостановлен (то есть, пока вы не выполните fg или bg для процесса)
Также обратите внимание, что в некоторых очень специфических обстоятельствах процесс может находиться в состоянии зомби/неработоспособности, что даже SIGKILL не может убить процесс. В этом случае вам нужно будет найти родительский процесс и убить родительский процесс.
Некоторые говорят, что kill -9
всегда срабатывает. Это заблуждение. Бывают ситуации, когда даже kill -9 не убивает процесс. Например, когда процесс находится в состоянии D (непрерывный сон). Процесс переходит в это состояние каждый раз, когда ожидает ввода-вывода (обычно не очень долго). Итак, если процесс ожидает ввода-вывода (например, на неисправном жёстком диске) и он не запрограммирован должным образом (с таймаутом), то вы просто не можете убить процесс. Что бы вы не делали. Вы просто можете попытаться сделать файл доступным, чтобы процесс продолжился.
Источник
Не убивается процесс Linux
Во время использования операционной системы Linux возникают ситуации, при которых процессы зависают и вы не можете их завершить. Например, вы хотите закрыть графическую программу или сервис, отправляете сигнал TERM, что в переводе означает завершить, а программа не реагирует на него.
Дело в том, что для того, чтобы программа могла завершится с помощью сигнала TERM, она должна быть в рабочем состоянии. Это сигнал просит программу завершится. Если программа зависла, она может попросту не получить ваш сигнал. Или программа может его обработать но не завершатся, этот сигнал носит рекомендательный характер. Вот возможные причины и варианты решения:
- Недостаточно прав — вы не можете убить процесс, запущенный от имени другого пользователя, используйте sudo;
- Программа зависла — необходимо ей послать сигнал KILL;
- Программа стала зомби — необходимо уничтожить её родительский процесс.
- Программа ждет ответа от драйвера — ждать или перезапустить компьютер.
В любом случае сначала пробуем от имени суперпользователя:
Сначала можно попробовать завершить программу с помощью сигнала KILL, для этого передайте -KILL или -9 в виде опции утилите kill:
Если это не работает, можно попробовать посмотреть родительский процесс программы с помощью утилиты ps:
Источник
Не убивается процесс Linux
Во время использования операционной системы Linux возникают ситуации, при которых процессы зависают и вы не можете их завершить. Например, вы хотите закрыть графическую программу или сервис, отправляете сигнал TERM, что в переводе означает завершить, а программа не реагирует на него.
Дело в том, что для того, чтобы программа могла завершится с помощью сигнала TERM, она должна быть в рабочем состоянии. Это сигнал просит программу завершится. Если программа зависла, она может попросту не получить ваш сигнал. Или программа может его обработать но не завершатся, этот сигнал носит рекомендательный характер. Вот возможные причины и варианты решения:
- Недостаточно прав — вы не можете убить процесс, запущенный от имени другого пользователя, используйте sudo;
- Программа зависла — необходимо ей послать сигнал KILL;
- Программа стала зомби — необходимо уничтожить её родительский процесс.
- Программа ждет ответа от драйвера — ждать или перезапустить компьютер.
В любом случае сначала пробуем от имени суперпользователя:
sudo kill -KILL идентификатор_процесса
Сначала можно попробовать завершить программу с помощью сигнала KILL, для этого передайте -KILL или -9 в виде опции утилите kill:
kill -KILL идентификатор_процесса
Если это не работает, можно попробовать посмотреть родительский процесс программы с помощью утилиты ps:
ps -xal | grep идентификатор_процесса
А затем его уничтожить. Подробнее об этом читайте в статье зомби процессы Linux. Последний возможный вариант — программа находится в состоянии TASK_UNITERRUPTIBLE. В это состояние программа, когда она ожидает ответа от драйвера. Например, драйвера оборудования или файловой системы. Обычно, когда драйвер отрабатывает, программа становится обычной, но при ошибках в драйверах программа может остаться в этом состоянии навсегда. Убить её нельзя, можно только перезагрузкой компьютера.
Источник
не убивается процесс
Уважаемое сообщество, помогите, пожалуйста с такой проблемой. На сервере с freebsd программист запустил скрипт, которые не убивается
Подскажите, пожалуйста, что можно сделать
по kill -9 pid само собой не умирает
Disk-state неубиваем. Тут ничего не поделаешь. Возможно, то к чему обращается скрипт, больше нет в системе (сетевая шара, диск, etc.)
Если критично или глаза мозолит, то к сожалению только перегрузка.
И да, PPID у процесса какой ? Убей родителя 🙂
вот это решето ядро bsd
Surprise! Это во всех POSIX системах так. И, о ужас, даже в Linux.
Про фряху хз, но разве в линуксе только перезагрузка? Ведь недоступные/висящие сетевые ресурсы можно отмонтировать через umount -f или если совсем плохо через umount -lf, после чего все D (uninterruptible sleep) либо убиваются, либо сами отваливаются.
uninterruptible как бы на мекает на uninterruptible. Т.е. процесс не получает совсем никаких сигналов (в том числе от kill), он може быть разбужен, только по прирыванию получения данных, которых он ждёт. В общем, курите мат-часть.
а если убить его родителя, посмотрев такового через pstree?
Не поможет. Процесс станет потомком процесса PID 1 (init) и всё.
в linux есть alt+sysrq+i например, из того что сходу вспоминается
alt+sysrq+i = Send the SIGKILL signal to all processes except init
Но! Процесс в состоянии D сигналы то не принимает.
не знаю, у меня любые процессы кроме инита подыхают при этом
Подскажите, пожалуйста, что можно сделать
Даже те, что D? Не верю.
Самый простой вариант потестить был бы поднять NFS сервер, прицепиться к шаре и прибить сервер. Любое обращение к маунтам приведёт к D. (тут нечего ругать NFS — это by design so и не лечится)
Если интересно и не лень — можешь сам проверить.
PS: выйти из D мозжно будет опять подняв NFS сервер
PS: выйти из D мозжно будет опять подняв NFS сервер
Выйти из D можно будет сделав umount -f, про что я выше говорил. А у тебя выходило что перезагрузка — единственный вариант.
«Матчасть» (man umount) спецом NFS упоминает:
-f Force unmount (in case of an unreachable NFS system). (Requires kernel 2.1.116 or later.)
Для NFS и umount, если мне не изменяет склероз, в линуксе отдельный, специальный хак, который работает (иногда) соответсвенно только в линукс. На free он не распространяется.
В общем случае, я имел в виду, что это старый, известный workaround для NFS, если тот подвис — поднять на том же IP донер-сервер, что бы на клиенте выйти из D.
У меня прямо сейчас в моём уютном линуксе пачка процессов зомби висит. В результате предыдущих манипуляций демоны после killall перестали потреблять по полтора ядра с, кажется, d-state, но теперь их не перезапустить. UFS в ядре точно рабочая? А с большими файлами? Или это проблема конкретного ПО?
Аватара кагбэ намикаэ =)
По сабжу: ИМХО, насколько понятно по симптомам, только ребут.
Всем спасибо за помощь. Проблема решилась сама, процесс сам пропал. К счастью, перезагружаться не пришлось
Источник
Как убить процесс Linux
Несмотря на то что 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 очень опасна, но так делать не стоит. Надеюсь, эта информация была полезна для вас.
Источник