zaLinux.ru

Почему команда kill не убивает процесс?


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

sudo kill ИДЕНТИФИКАТОР-ПРОЦЕССА

Связанная статья: В чём различия и как пользоваться командами kill, pkill и killall

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

Получить идентификатор процесса зная имя исполнимого файла можно командой:

ps -e | grep 'ИМЯ'

Этой же командой можно проверять, работает ли ещё процесс.

Связанная статья: Как использовать команду ps для мониторинга процессов Linux

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

Название команды kill продолжает вводить в заблуждение многих, многих пользователей (включая меня в начале). Предполагается, что когда вы говорите «kill X», это в точности означает «убить процесс X». Но на самом деле это далеко не так. Команда kill всего лишь посылает процессу один из сигналов.

Если kill вызывается без каких-либо параметров, он отправляет сигнал номер 15 (SIGTERM). Этот сигнал может игнорироваться процессом. Этот сигнал уведомляет процесс о необходимости привести в порядок свои вещи, а затем процесс сам правильно завершает работу. Это хороший способ.


Вы также можете «послать» сигнал номер 9 (SIGKILL), который процесс не может игнорировать. Процесс даже не распознает его, потому что ядро завершает процесс, а не сам процесс. Это злой путь.

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

Попробуйте:

kill -9 ИДЕНТИФИКАТОР-ПРОЦЕССА

Если вы приостановите процесс с помощью CTRL-z, он будет блокировать большинство сигналов, пока он приостановлен (то есть, пока вы не выполните fg или bg для процесса).

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

Некоторые говорят, что kill -9 <PID> всегда срабатывает. Это заблуждение. Бывают ситуации, когда даже kill -9 не убивает процесс. Например, когда процесс находится в состоянии D (непрерывный сон). Процесс переходит в это состояние каждый раз, когда ожидает ввода-вывода (обычно не очень долго). Итак, если процесс ожидает ввода-вывода (например, на неисправном жёстком диске) и он не запрограммирован должным образом (с таймаутом), то вы просто не можете убить процесс. Что бы вы не делали. Вы просто можете попытаться сделать файл доступным, чтобы процесс продолжился.


Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *