Почему я не должен использовать 'kill -9' / SIGKILL

14

Отправка этого вопроса, потому что я был удивлен, что не нашел на него прямой ответ; извиняюсь, если это дубликат - я посмотрел!

Я слышал это kill -9или kill -SIGKILLплохо, но я не понимаю, почему. Если я не должен, kill -9что я должен сделать, чтобы убить процесс?

dimo414
источник
2
Суть вопроса неверна. SIGKILL - это просто инструмент. Рекомендуется в некоторых ситуациях и не рекомендуется в других ситуациях (как и все другие инструменты).
Кубанчик
@kubanczyk, конечно, но это часто неправильно используемый инструмент, используемый без понимания его цели. Я видел много тем, где А говорит: « Просто kill -9так », OP - « отлично, это сработало! Теперь я буду помнить об этом! », И В приходит, чтобы предупредить « ждать kill -9опасно! » Только после факта.
dimo414

Ответы:

15

SIGKILLвытаскивает коврик из вашего рабочего процесса, немедленно прекращая его. Для очень простых программ это хорошо; однако на практике очень мало «простых» программ.

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

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

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

Вообще говоря, вы можете использовать Ctrl+ C(который отправляет приоритетный процесс a SIGINT) или SIGTERM(как в «завершить»), чтобы дать команду процессу остановить то, что он делает, и выйти.

Некоторое дальнейшее чтение:

dimo414
источник