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