← Назад к вопросам

В чём разница между kill-15 и kill-9 в Linux?

1.8 Middle🔥 82 комментариев
#Операционные системы и Linux

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между kill -15 (SIGTERM) и kill -9 (SIGKILL)

В Linux команда kill используется для отправки сигналов процессам. Цифры -15 и -9 обозначают разные типы сигналов, кардинально отличающиеся по поведению и последствиям.

kill -15 (SIGTERM) — Graceful Shutdown (Корректное завершение)

SIGTERM (сигнал 15) — это сигнал корректного завершения, рекомендованный для штатного останова процессов. Когда системе или пользователю нужно завершить процесс, это стандартный способ.

Ключевые особенности:

  • Процессу отправляется запрос на завершение, но он может:
    1. Корректно завершить работу: освободить ресурсы (память, файловые дескрипторы, сетевые соединения).
    2. Игнорировать сигнал (если он его обрабатывает). Для этого в программе должен быть обработчик сигнала.
    3. Выполнить завершающие действия: закрыть файлы, сохранить состояние, уведомить дочерние процессы.
  • Пример кода обработчика 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

Рекомендуемый подход на практике

  1. Всегда сначала отправлять SIGTERM:

    kill -15 <PID>
    # или просто kill <PID>, т.к. SIGTERM используется по умолчанию
    

    Дать процессу время на корректное завершение (обычно 30 секунд).

  2. Если процесс не завершается, использовать SIGKILL:

    kill -9 <PID>
    

    Но учитывайте, что это может привести к:

    • Утечкам ресурсов в системе
    • Повреждению данных (если процесс писал в файл)
    • Проблемам с дочерними процессами (они могут стать зомби)

Что происходит в Kubernetes и Docker?

В контейнеризованных средах:

  • docker stop отправляет SIGTERM, затем через таймаут — SIGKILL.
  • В Kubernetes terminationGracePeriodSeconds определяет, сколько ждать после SIGTERM перед отправкой SIGKILL.

Вывод

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