убить -9 программ, но они все еще держатся


11

Я пытался убить все мои фоновые задания, представленные ранее под KUbuntu

kill -9 $(jobs -p)

Хотя эта команда сразу дала сообщение как

[1] убил myjob1

[2] убил myjob2

Я все еще вижу, как их процессы зависают на выходе top, а использование процессора и памяти не изменяется на выходе uptime и свободно.

Так что, наверное, я не убил их должным образом. Может кто-нибудь объяснить, что со мной происходит и что мне делать?

Я обнаружил, что сверху, если набрать k и ввести PID, я могу убить процессы один за другим. ТАК это отличается от команды kill?

Я также нашел где-то в Интернете http://www.ruhr.de/home/smallo/award.html о том, что не рекомендуется убивать -9

Бесполезное использование Kill -9 формы письма

(Цитата мерзость)

Нет нет нет. Не используйте kill -9.

Это не дает процессу возможность чисто:

1) отключить разъемы

2) очистить временные файлы

3) сообщить своим детям, что он уходит

4) сбросить свои терминальные характеристики

и так далее, и так далее, и так далее.

Как правило, отправьте 15 и подождите секунду или две, и если это не сработает, отправьте 2, а если это не сработает, отправьте 1. Если это не сработает, УДАЛИТЕ ДВОЙНОЙ, потому что программа плохо себя ведет!

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

Это правда? Что означает «отправить 15», «отправить 2» и «отправить 1»? Они сами команды или «убить -15 PID», «убить -2 PID» и «убить -1 PID»?

Спасибо и всего наилучшего!


Удаление двоичного файла (исполняемого файла) само по себе не убьет процесс. Файловая система будет знать, что процесс использует этот файл, и позволит процессу «увидеть» файл даже после его удаления.
Джеппе Стиг Нильсен

Ответы:


9

Возможно, ваш процесс мертв, но он все еще отображается в записи таблицы процессов, потому что это «процесс зомби». Когда дочерний процесс завершается и полностью исчезает (за исключением записи в таблице процессов) и родитель не может получить статус завершения (через любую из функций ожидания), это называется зомби ... Убийство (через сигнал) работать, потому что это уже прекращено. Что вам нужно сделать, это выяснить его родительский процесс и уничтожить его одним очистителем, таким образом, не используя kill - 9

вот два простых шага, чтобы убить зомби ...

  1. если родитель еще жив, попробуйте убить его (или SIGHUP - все, что вам нужно)
  2. если номер 1 не работает, в ядре есть ошибка .... перезагрузка - ваш друг и исправьте эту ошибку: ->

Я отправляю свои работы в командной строке и в фоновом режиме, кем бы были их родители? И как я могу найти их родителей, если таковые имеются?
Тим

Используйте -fфлаг для ps, чтобы увидеть родительские процессы.
Джек М.

6

см. man killдля определения различных доступных сигналов, но да.

  • 15 - SIGTERM , и просит программу выйти.
  • 2 - SIGINT и эквивалентно Control-C
  • 1 - SIGHUP , и указывает, что терминал повесил трубку.

Они информируют процесс о том, что пользователь «завершил» процесс, хотя указывают на несколько иные причины. SIGTERM можно интерпретировать как «завершить текущую задачу, но затем завершиться; не запускать другую», SIGINT означает «отказаться от того, что вы «Вы делаете и выходите», SIGHUP просто означает, что никто больше не слушает (серверный процесс может законно реагировать на SIGHUP, прекратив вывод на консоль и продолжая работать).

  • 9 - это SIGKILL , и он особенный, потому что он единственный, который процесс не может перехватить и обработать внутри. Это просто приводит к тому, что ядро ​​никогда не возвращает управление процессом, не давая ему возможности очиститься.

сверху, если набрать k и ввести PID, я могу убить процессы по одному. Так это эквивалентно некоторым опциям команды kill?
Тим

Да, top просто посылает сигнал процессу, так же как и kill. AFAICT, по умолчанию используется сигнал 15 (SIGTERM).
puetzk


1

Это означает «убить -1» или «убить -15» вместо того, чтобы набирать «убивать -9». Kill -9 - это хардкорная пуля в голове любого запущенного процесса, убивающая его в грязном состоянии, что может вызвать утечку памяти, бла-бла.

Если вы вводите команду kill -9, и она не работает, тогда я постараюсь убедиться, что процесс не запускается, и что у вас есть разрешение на его уничтожение.


Как вы будете выглядеть, чтобы убедиться, что процесс не возрождается? Так как у меня есть процессы, у меня есть разрешение убить этот процесс?
Тим

У него должен быть другой номер процесса, если он есть. Поэтому, если вы выполните команду ps -Al и увидите processA, вы убьете -9 processA, а затем выполните команду ps -Al, и в очереди процессов останется STILL, убедитесь, что это тот же процесс A, а не новый.
Satanicpuppy

И он скажет вам, если у вас нет разрешения убить процесс.
Satanicpuppy

0

Сигнал 9 SIGKILL. Отправка SIGKILL просит операционную систему немедленно убить процесс, без вопросов. Процесс не уведомлен заранее и не имеет возможности убирать за собой.

Сигнал 15 является SIGTERM. При отправке SIGTERM просит ОС попросить процесс отключиться.

SIGKILL может быть проигнорирован, если ОС считает, что процесс выполняет IO, или если это Zombie (дочерний процесс, родительский процесс которого после него не очистился).

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

Примечание. Командная строка killвсегда запрашивает у ОС отправку сигнала приложению, что она может делать, а может и не делать, в зависимости от того, кому принадлежит процесс и т. Д.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.