9

Я пытался убить все мои фоновые задания, представленные ранее под 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»?

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

5 ответов5

8

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

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

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

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

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

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

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

Это означает использование kill -15 PID (или другого числа) вместо kill -9 PID . Числа эквивалентны различным сигналам Unix .

1

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

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

0

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .