bitlvl
RU

Справочник сигналов Linux

Введите имя или номер, чтобы найти сигнал. Последний столбец — код выхода, который сообщает shell, когда процесс погибает от этого сигнала (128 + номер). Таблица на английском языке.

 
№ИмяПо умолчаниюЗначение / причинаКод выхода
1SIGHUPTerminateHangup: the controlling terminal closed. Daemons reuse it to mean “reload configuration”.129
2SIGINTTerminateInterrupt from the keyboard (Ctrl-C).130
3SIGQUITCore dumpQuit from the keyboard (Ctrl-\); dumps core.131
4SIGILLCore dumpIllegal instruction.132
5SIGTRAPCore dumpTrace/breakpoint trap (debuggers).133
6SIGABRTCore dumpAbort signal from abort().134
7SIGBUSCore dumpBus error: bad memory access (alignment, mmap).135
8SIGFPECore dumpFloating-point exception, including integer divide by zero.136
9SIGKILLTerminateKill signal. Cannot be caught, blocked or ignored. Last resort; the process gets no chance to clean up.137
10SIGUSR1TerminateUser-defined signal 1. nginx: reopen logs; dd: print progress; Apache: graceful restart.138
11SIGSEGVCore dumpSegmentation fault: invalid memory reference.139
12SIGUSR2TerminateUser-defined signal 2. nginx: binary upgrade; Gunicorn: re-exec.140
13SIGPIPETerminateWrite to a pipe with no reader. Default kills the process, which is why `yes | head` stops.141
14SIGALRMTerminateTimer signal from alarm().142
15SIGTERMTerminateTermination request. The default for kill, systemd stop and docker stop; programs should catch it and shut down cleanly.143
16SIGSTKFLTTerminateStack fault on coprocessor (unused).144
17SIGCHLDIgnoreChild stopped or terminated.145
18SIGCONTContinueContinue if stopped (fg, kill -CONT).146
19SIGSTOPStopStop the process. Cannot be caught or ignored.147
20SIGTSTPStopStop typed at the terminal (Ctrl-Z).148
21SIGTTINStopBackground process tried to read from the terminal.149
22SIGTTOUStopBackground process tried to write to the terminal.150
23SIGURGIgnoreUrgent data on a socket.151
24SIGXCPUCore dumpCPU time limit exceeded.152
25SIGXFSZCore dumpFile size limit exceeded.153
26SIGVTALRMTerminateVirtual alarm clock.154
27SIGPROFTerminateProfiling timer expired.155
28SIGWINCHIgnoreTerminal window size changed.156
29SIGIOTerminateI/O now possible (asynchronous I/O).157
30SIGPWRTerminatePower failure.158
31SIGSYSCore dumpBad system call: the seccomp filter rejected a syscall (systemd SystemCallFilter=, Docker default profile).159

Результаты и сообщения этого инструмента выводятся на английском языке.

Что такое сигнал

Сигнал — это однословное сообщение, которое ядро доставляет процессу: «терминал закрылся», «вы обратились к недопустимой памяти», «пожалуйста, остановитесь». Для большинства из них процесс может установить обработчик, проигнорировать их или принять действие по умолчанию, которым обычно является завершение (иногда с дампом памяти). Два сигнала нельзя ни перехватить, ни проигнорировать: SIGKILL завершает процесс на месте, а SIGSTOP замораживает его.

TERM против KILL

kill PID отправляет SIGTERM: просьбу. Хорошо написанная программа перехватывает его, завершает текущий запрос, сбрасывает буферы файлов, закрывает соединения и выходит; именно его первым отправляют systemd, Docker и Kubernetes. kill -9 отправляет SIGKILL: ядро удаляет процесс, не выполняя ни строчки его кода, поэтому блокировки остаются занятыми, временные файлы остаются, а незавершённые записи теряются. Используйте его только после того, как TERM дали время (systemd ждёт TimeoutStopSec, Docker — 10 секунд по умолчанию) и он не сработал.

Сигналы как API

  • SIGHUP: демоны перечитывают конфигурацию (nginx, sshd, HAProxy с семантикой -sf через reload в systemd). Для процесса в переднем плане он означает, что терминал пропал; nohup игнорирует его.
  • SIGUSR1 / SIGUSR2: определяются программой. nginx переоткрывает логи по USR1 и обновляет бинарник по USR2; dd выводит прогресс по USR1; Gunicorn и Unicorn используют их для плавного перезапуска.
  • SIGPIPE: запись в канал, читатель которого завершился. Его действие по умолчанию — завершение — объясняет, почему yes | head заканчивается и почему серверы должны игнорировать его или обрабатывать ошибки записи.
  • SIGCHLD: дочерний процесс завершился; родители забирают детей через wait(), а родитель, который этого не делает, оставляет зомби.
  • SIGWINCH: размер терминала изменился; редакторы и мультиплексоры перерисовываются.

Отправка сигналов

kill -TERM 1234        # по имени (или kill -15 1234)
kill -s USR1 $(pidof nginx)
pkill -HUP sshd        # по имени процесса
killall -9 runaway     # все процессы с этим именем
systemctl kill -s HUP myservice
docker kill --signal=SIGUSR1 container

Номера 1–15 одинаковы во всех Unix; выше они различаются по архитектурам (SIGUSR1 — это 10 на x86 и 30 на SPARC/MIPS), поэтому в скриптах следует использовать имена.

Вопросы

В чём разница между SIGTERM и SIGKILL?

SIGTERM просит процесс завершиться, и его можно обработать; SIGKILL завершает его немедленно, и его нельзя перехватить. Всегда сначала пробуйте TERM; KILL — для зависших процессов.

Что такое сигнал 11 / SIGSEGV?

Ошибка сегментации: программа прочитала или записала память, которая ей не принадлежит, обычно нулевой или висячий указатель в коде на C/C++ или баг в нативном расширении. Shell сообщает код выхода 139.

Почему мой процесс завершился с кодом 137, хотя никто не запускал kill -9?

Это сделало ядро: при исчерпании памяти OOM killer отправляет SIGKILL самому большому процессу, а среды выполнения контейнеров делают то же при достижении лимита памяти. Проверьте dmesg или флаг OOMKilled контейнера.

Можно ли игнорировать SIGINT, чтобы Ctrl-C не останавливал мой скрипт?

Да: trap "" INT в bash или signal.signal(SIGINT, SIG_IGN) в Python. Обычно лучше перехватить его и прибраться перед выходом, чтобы пользователь всё же мог остановить скрипт.