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

Какие сигналы можно отправить процессу в Linux? Чем SIGTERM отличается от SIGKILL?

2.3 Middle🔥 141 комментариев
#Linux и администрирование

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

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

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

Сигналы процесса в Linux

В Linux сигналы (Signals) — это механизм межпроцессного взаимодействия (IPC), используемый для уведомления процесса о возникновении определенного события. Ядро, другие процессы или сам процесс могут отправлять сигналы. Они позволяют управлять выполнением процесса (например, остановкой, перезапуском) или реагировать на асинхронные события (например, нажатие Ctrl+C).

Основные типы сигналов (список неполный)

  • SIGHUP (1) — "Hang Up". Традиционно отправляется при обрыве терминального соединения. Часто используется для перечитывания конфигурационных файлов (например, демонами).
  • SIGINT (2) — "Interrupt". Отправляется при нажатии Ctrl+C в терминале. Запрашивает корректное завершение процесса.
  • SIGQUIT (3) — "Quit". Отправляется при нажатии Ctrl+\. Вызывает завершение процесса с созданием core dump (дамп памяти для отладки).
  • SIGKILL (9) — "Kill". Немедленная безусловная остановка процесса. Не может быть перехвачен или проигнорирован.
  • SIGTERM (15) — "Terminate". Корректный запрос на завершение (по умолчанию от команды kill). Процесс может его перехватить и выполнить чистый выход.
  • SIGSTOP (19) — "Stop". Приостанавливает (останавливает) выполнение процесса. Не может быть перехвачен или проигнорирован.
  • SIGCONT (18) — "Continue". Возобновляет выполнение остановленного процесса.
  • SIGUSR1 (10) / SIGUSR2 (12) — "User-defined". Пользовательские сигналы для кастомной логики в приложениях (например, ротация логов, переоткрытие файлов).
  • SIGCHLD (17) — "Child Status Changed". Посылается родительскому процессу при завершении дочернего.
  • SIGSEGV (11) — "Segmentation Violation". Посылается ядром при попытке доступа к невалидной области памяти.

Для просмотра полного списка можно использовать команды kill -l или trap -l.

# Пример вывода списка сигналов
$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
...

Ключевые отличия SIGTERM от SIGKILL

Это один из фундаментальных вопросов при управлении процессами в Linux/Unix.

SIGTERM (Signal Termination, №15)

  • Назначение: Вежливый запрос на завершение работы. Это стандартный способ остановить процесс, позволяющий ему выполнить процедуры корректного завершения (graceful shutdown).
  • Обработка:
    *   **Может быть перехвачен** (caught) и обработан программой. Приложение может установить свой обработчик сигнала (signal handler) с помощью системного вызова `signal()` или `sigaction()`.
    *   По умолчанию, если обработчик не установлен, процесс завершается, но у него есть возможность **выполнить финализацию** (закрыть файлы, сетевые соединения, сохранить состояние, уведомить другие процессы).
  • Использование: Первый и предпочтительный шаг при остановке сервиса или процесса. Даёт программе шанс завершиться в согласованном состоянии.
  • Аналогия: Вежливая просьба "пожалуйста, закончите работу и закройте за собой".
// Пример обработки SIGTERM на языке C
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

void sigterm_handler(int signum) {
    printf("Получен SIGTERM. Выполняем чистый выход: сохраняем данные, закрываем соединения...\n");
    // Логика graceful shutdown
    exit(0);
}

int main() {
    signal(SIGTERM, sigterm_handler);
    while(1) {
        sleep(1);
    }
    return 0;
}

SIGKILL (Signal Kill, №9)

  • Назначение: Немедленная и безусловная остановка процесса. Это "тяжелая артиллерия", используемая, когда процесс не реагирует на SIGTERM.
  • Обработка:
    *   **НЕ может быть перехвачен, обработан или проигнорирован** процессом-получателем.
    *   Ядро ОС **немедленно завершает процесс**, не давая ему никакой возможности выполнить какие-либо финальные действия.
    *   Это гарантированный способ "убить" процесс (если он не находится в состоянии `Z` — зомби, или `D` — uninterruptible sleep).
  • Последствия: Риск потери данных, оставления временных файлов, сломанных соединений, так как процедуры очистки не выполняются.
  • Аналогия: Выключение компьютера из розетки во время важной операции.
# Примеры отправки сигналов с помощью утилиты kill
$ kill -TERM <PID>   # или просто kill <PID> - отправка SIGTERM
$ kill -9 <PID>      # отправка SIGKILL (если процесс "не слушается")
$ kill -KILL <PID>   # альтернативная форма отправки SIGKILL

Сводная таблица различий

ХарактеристикаSIGTERM (15)SIGKILL (9)
Тип запросаВежливый, запрос на завершениеЖёсткий, приказ на немедленное завершение
Возможность обработкиДа, можно перехватить и выполнить graceful shutdownНет, сигнал обрабатывается ядром в обход процесса
ГибкостьВысокая. Позволяет реализовать чистый выходНулевая. Действие предопределено ядром.
РискиПроцесс может проигнорировать или "зависнуть" при завершенииПотеря данных, несогласованное состояние системы
Стандартный сценарий использованияПервый шаг при остановке сервиса (systemctl stop, docker stop)Крайняя мера, когда процесс не реагирует на SIGTERM

Практические рекомендации для DevOps/SRE

  1. Стандартный пайплайн остановки: Всегда сначала отправляйте SIGTERM (например, через systemctl stop, docker stop, или kill <PID>). Выжидайте таймаут (обычно от 10 до 30 секунд), определённый в конфигурации приложения/оркестратора.
  2. SIGKILL как крайняя мера: Если по истечении таймаута процесс всё ещё жив, отправляйте SIGKILL. Современные оркестраторы (Kubernetes, Docker, systemd) делают это автоматически (сначала SIGTERM, затем SIGKILL).
  3. Важность graceful shutdown: При проектировании приложений обязательно реализуйте корректную обработку SIGTERM. Это критически важно для:
    *   **Безопасного завершения работы в Kubernetes** (Pod termination lifecycle).
    *   **Rolling updates** и деплоев без потерь соединений.
    *   Автоматического масштабирования (scale-in).
  1. Непрерываемый сон (Uninterruptible Sleep): Процесс в состоянии D (например, во время синхронных операций ввода/вывода с "глючным" оборудованием) не может быть убит даже SIGKILLом. Требуется перезагрузка ядра или устранение проблемы с устройством.

Понимание этой разницы — краеугольный камень для создания отказоустойчивых, надёжных систем и корректного управления жизненным циклом процессов в production-среде.

Какие сигналы можно отправить процессу в Linux? Чем SIGTERM отличается от SIGKILL? | PrepBro