Почему мы используем kill -9 всегда

Я хотел бы знать стадии убийства. Мы всегда используем kill-9, а не любые другие цифры. Может кто-нибудь объяснить причину.

Первоначально команда kill / system call просто убила процесс. Это было сделано ядром, и процесс просто исчез, никогда не сообщая об этом. Думаю, это остановилось вокруг третьего издания. kill -9 говорит, чтобы отправить сигнал номер 9 в процесс. В отличие от большинства (все это зависит) других сигналов, он не может быть «пойман» процессом и обработан каким-либо образом. Другим способом остановить процесс является kill -15 (или kill -TERM), который сообщает процессу, что он завершается, но дает возможность выполнить очистку.

Использование kill -9 – «гарантированный» способ убить процесс; если он застрял, kill -15 может не всегда работать. Следовательно, многие люди все еще используют kill -9 как «первый курорт».

Причина, по которой «конечный» сигнал об убийстве – номер 9, – это то, как они это делали. В то время было по крайней мере еще восемь различных сигналов, и я думаю, что номера были назначены человеком, который запрограммировал эту часть ядра (возможно, Кен Томпсон). Некоторые из более низких чисел в настоящее время в значительной степени являются историческими, поскольку они отображают аппаратные инструкции и / или события в аппаратном обеспечении PDP-11. И есть и многие другие, выше 9.

Обратите внимание, что фактические числа не имеют уровней или иерархии в них; ни в коем случае не является сигналом 8 'меньше', чем сигнал 9 или «больше», чем сигнал 7.

На самом деле, мне очень нравится ответ Боба.

Используемые мной сигналы:

  • -1 ( -HUP ) – перезапустить процесс
  • -2 ( -INT ) – завершение процесса
  • -9 ( -KILL ) – пусть ядро -KILL процесс
  • -11 ( -SEGV ) – сбой программы
  • -15 ( -TERM ) – по умолчанию запросите программу, чтобы завершить ее.

Убить без сигнала отправит -15 ( -TERM ).

Все вышеупомянутые имена сигналов могут быть указаны префиксом SIG (например, -SIGKILL ), однако это необязательно.

Обратите внимание: kill -11 заставит программу выйти с ошибкой сегментации, я иногда использую ее, когда kill -9 не завершит процесс. (Вы можете потерять данные, если вы произведете kill -9 или kill -11 в процессе, так что будьте осторожны!)

Вы используете ps -ef | grep <program> ps -ef | grep <program> чтобы проверить процесс. Чтобы избавиться от процесса (у которого есть родительский PID 1), вам нужно kill -HUP 1 или kill -1 1 (как с правами root). Обратите внимание, что PID 1 – это система init.

Итак, чтобы завершить процесс, выпустите kill <pid> (точно так же, как kill -15 <pid> ), если это не удается, я пробую эти другие (вы можете потерять данные!), kill -2 <pid> (сродни выполнению Ctrl+c ), если это не удастся kill -9 <pid> , если это не удастся kill -11 <pid> , если это не удается, процесс, скорее всего, будет зомби-процессом, убедитесь, что в этом случае используется ps -ef | grep <program_name> ps -ef | grep <program_name> или ps -ef | grep <pid> ps -ef | grep <pid> , он должен упомянуть об «исчезновении» после процесса. Это когда вы выдаете kill -1 1 .

Надеюсь, это поможет 😉

Некоторые программы, такие как Java JVM, могут быть настроены на сброс потоков / кучи (для устранения неполадок), когда они получают сигнал, в этих случаях я также использую kill …

Ну … все программисты разные, я полагаю. Лично я стараюсь избегать отправки kill -9 если могу, потому что он имеет тенденцию создавать процессы зомби, поскольку он не позволяет процессу убивать выполнение любых действий по очистке, которые могут или не могут существовать в программе, которую пользователь хочет убийство.

Это сигнал «последнего средства», поэтому, хотя редко бывает предпочтительным способом прекращения программы, он обычно используется (особенно в плохо написанных программах), потому что он «всегда работает», так сказать …

Если процесс игнорирует SIGINT или SIGTERM , то для этого должна быть причина – возможно, процесс должен освободить файл блокировки, удалить некоторые временные файлы и / или выполнить некоторые другие действия «очистить» до прекращение. Конечно, программы плохо себя ведут, и поэтому нам нужен SIGKILL для тех (на наш SIGKILL редких) сценариев.

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

Причина, по которой вы часто ее видите, это то, что это единственный сигнал, который ядро не может игнорировать. В оболочке вы можете поиграть с командой trap чтобы убедиться сами, но это очень хорошее объяснение того, что kill -9 :

Сигнал 9 из космического пространства

Существует один сигнал, который вы не можете захватить: SIGKILL или сигнал 9. Ядро немедленно завершает любой процесс, отправленный этим сигналом, и обработка сигнала не выполняется. Так как он всегда будет прервать программу, которая застряла, повесилась или каким-либо другим образом прикручивалась, возникает соблазн подумать, что это простой выход, когда вам нужно что-то остановить и уйти. Часто вы увидите ссылки на следующую команду, которая отправляет сигнал SIGKILL: kill -9

Однако, несмотря на очевидную легкость, вы должны помнить, что при отправке этого сигнала приложение не обрабатывает обработку. Часто это нормально, но со многими программами это не так. В частности, многие сложные программы (и некоторые не очень сложные) создают блокирующие файлы для одновременного запуска нескольких копий программы. Когда программа, которая использует файл блокировки, отправляется SIGKILL, у нее нет возможности удалить файл блокировки при ее завершении. Наличие файла блокировки предотвратит перезапуск программы, пока файл блокировки не будет удален вручную.

Имейте в виду. Используйте SIGKILL в качестве крайней меры.

Источник