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

9286
Tim

Я пытался убить все мои фоновые задания, представленные ранее под 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
Удаление двоичного файла (исполняемого файла) само по себе не убьет процесс. Файловая система будет знать, что процесс использует этот файл, и позволит процессу «увидеть» файл даже после его удаления. Jeppe Stig Nielsen 7 лет назад 0

5 ответов на вопрос

7
nkr1pt

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

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

  1. если родитель еще жив, попробуйте убить его (или SIGHUP - все, что вам нужно)
  2. если номер 1 не работает, в ядре есть ошибка .... перезагрузка - ваш друг и исправьте эту ошибку: ->
Я отправляю свои работы в командной строке и в фоновом режиме, какими будут их родители? И как я могу найти их родителей, если таковые имеются? Tim 15 лет назад 0
Используйте флаг `-f` для ps, чтобы увидеть родительские процессы. Jack M. 15 лет назад 0
5
puetzk

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

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

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

  • 9 - это SIGKILL, и он особенный в том смысле, что он единственный, который процесс не может перехватить и обработать внутри. Это просто приводит к тому, что ядро ​​никогда не возвращает управление процессом, не давая ему возможности очиститься.
сверху, если набрать k и ввести PID, я могу убить процессы по одному. Так это эквивалентно некоторым опциям команды kill? Tim 15 лет назад 0
Да, top просто посылает сигнал процессу, так же как и kill. AFAICT, сигнал по умолчанию, который наиболее часто используется - 15 (SIGTERM). puetzk 15 лет назад 0
1
Adriano Varoli Piazza

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

1
Satanicpuppy

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

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

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

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

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

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

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

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

Похожие вопросы