В чём разница между kill-15 и kill-9 в Linux?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между kill -15 (SIGTERM) и kill -9 (SIGKILL)
В Linux команда kill используется для отправки сигналов процессам. Цифры -15 и -9 обозначают разные типы сигналов, кардинально отличающиеся по поведению и последствиям.
kill -15 (SIGTERM) — Graceful Shutdown (Корректное завершение)
SIGTERM (сигнал 15) — это сигнал корректного завершения, рекомендованный для штатного останова процессов. Когда системе или пользователю нужно завершить процесс, это стандартный способ.
Ключевые особенности:
- Процессу отправляется запрос на завершение, но он может:
- Корректно завершить работу: освободить ресурсы (память, файловые дескрипторы, сетевые соединения).
- Игнорировать сигнал (если он его обрабатывает). Для этого в программе должен быть обработчик сигнала.
- Выполнить завершающие действия: закрыть файлы, сохранить состояние, уведомить дочерние процессы.
- Пример кода обработчика
SIGTERMна Go:
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGTERM)
go func() {
<-sigChan
fmt.Println("Получен SIGTERM, выполняем cleanup...")
// Cleanup операции
time.Sleep(2 * time.Second)
fmt.Println("Cleanup завершен, выход.")
os.Exit(0)
}()
fmt.Println("Процесс запущен (PID:", os.Getpid(), ")")
time.Sleep(1 * time.Hour) // Имитация долгой работы
}
kill -9 (SIGKILL) — Immediate Termination (Немедленное уничтожение)
SIGKILL (сигнал 9) — это сигнал немедленного принудительного завершения, который нельзя перехватить или проигнорировать.
Ключевые особенности:
- Ядро Linux немедленно завершает процесс, без возможности выполнить какие-либо завершающие действия.
- Процесс не может перехватить или обработать этот сигнал — он уничтожается ядром.
- Ресурсы могут остаться занятыми: открытые файлы, сокеты, разделяемая память могут некорректно освободиться.
- Используется только в крайних случаях: когда процесс не реагирует на
SIGTERMили завис.
Сравнительная таблица
| Критерий | kill -15 (SIGTERM) | kill -9 (SIGKILL) |
|---|---|---|
| Тип завершения | Корректное, graceful | Принудительное, немедленное |
| Обработка процессом | Можно перехватить и обработать | Нельзя перехватить или игнорировать |
| Освобождение ресурсов | Процесс может освободить ресурсы | Ресурсы могут остаться занятыми |
| Рекомендуемое использование | Штатное завершение | Только если процесс не отвечает на SIGTERM |
| Влияние на приложение | Предсказуемое, безопасное | Может привести к потере данных, corruption |
Рекомендуемый подход на практике
-
Всегда сначала отправлять
SIGTERM:kill -15 <PID> # или просто kill <PID>, т.к. SIGTERM используется по умолчаниюДать процессу время на корректное завершение (обычно 30 секунд).
-
Если процесс не завершается, использовать
SIGKILL:kill -9 <PID>Но учитывайте, что это может привести к:
- Утечкам ресурсов в системе
- Повреждению данных (если процесс писал в файл)
- Проблемам с дочерними процессами (они могут стать зомби)
Что происходит в Kubernetes и Docker?
В контейнеризованных средах:
docker stopотправляетSIGTERM, затем через таймаут —SIGKILL.- В Kubernetes
terminationGracePeriodSecondsопределяет, сколько ждать послеSIGTERMперед отправкойSIGKILL.
Вывод
SIGTERM — это "вежливая просьба" завершиться, которую приложение может обработать. SIGKILL — это "выстрел в голову", который нельзя предотвратить. Правильная практика — всегда начинать с SIGTERM и использовать SIGKILL только как last resort, когда процесс не реагирует или система требует немедленного освобождения ресурсов.