csignal
У операційних системах типу Unix (Linux, macOS) сигнали — це форма міжпроцесної взаємодії (IPC). Хоча більшість сигналів мають конкретне призначення (як-от SIGKILL для зупинки процесу), існують спеціальні сигнали, зарезервовані саме для користувацьких потреб.
| # | NAME | C/C++ | htop | |
|---|---|---|---|---|
| 1 | HUP | SIGHUP | SIGHUP | “Hangup” (відбій). Раніше означав розрив зв’язку з терміналом. Зараз часто використовується для того, щоб змусити фонові програми (демони) перечитати конфігураційні файли. |
| 2 | INT | SIGINT | SIGINT | “Interrupt” (переривання). Виникає, коли ви натискаєте Ctrl+C. |
| 3 | QUIT | SIGQUIT | SIGQUIT | Схожий на INT (натискання Ctrl+\), але змушує програму створити “core dump” (знімок пам’яті) для налагодження. |
| 4 | ILL | SIGILL | SIGILL | “Illegal Instruction”. Програма намагається виконати команду, яку процесор не розуміє. |
| 5 | TRAP | SIGTRAP | SIGTRAP | Використовується налагоджувачами (debugger) для встановлення точок зупинки (breakpoints). |
| 6 | ABRT | SIG | SIG | “Abort”. Посилається самою програмою через функцію abort(), зазвичай при критичній помилці в коді. |
| 7 | BUS | - | SIGBUS | Помилка шини. Програма намагається отримати доступ за неправильною адресою пам’яті. |
| 8 | FPE | SIGFPE | SIGFPE | “Floating Point Exception”. Виникає при помилковій математичній операції, наприклад, при діленні на нуль. |
| 9 | KILL | SIGKILL | SIGKILL | Найпотужніший сигнал. Він миттєво вбиває процес. Його неможливо проігнорувати або перехопити через код. |
| 10 | USR1 | - | SIGUSR1 | Ці сигнали не мають визначеного системою значення. |
| 11 | SEGV | SIGSEGV | SIGSEGV | “Segmentation Fault”. Найвідоміша помилка програміста — спроба звернутися до пам’яті, яка програмі не належить. |
| 12 | USR2 | - | SIGUSR2 | Ці сигнали не мають визначеного системою значення. |
| 13 | PIPE | SIGPIPE | SIGPIPE | Виникає, коли програма намагається писати в “трубу” (pipe), інший кінець якої вже закритий. |
| 14 | ALRM | SIGALRM | SIGALRM | Сигнал-будильник. Використовується для таймерів. |
| 15 | TERM | SIGTERM | SIGTERM | “Terminate”. Стандартний сигнал для ввічливого прохання до програми завершити роботу. На відміну від KILL, програма може його “спіймати” і встигнути зберегти дані. |
| 16 | STKFLT | - | SIGSTKFLT | Помилка стека на співпроцесорі (зараз майже не використовується). |
| 17 | CHLD | - | SIGCHLD | “Child”. Надсилається батьківському процесу, коли його дочірній процес завершується або зупиняється. |
| 18 | CONT | - | SIGCONT | “Continue”. Наказує зупиненому процесу продовжити роботу. |
| 19 | STOP | - | SIGSTOP | Зупиняє (ставить на паузу) процес. Як і KILL, його не можна перехопити. |
| 20 | TSTP | - | SIGTSTP | “Terminal Stop”. Виникає при натисканні Ctrl+Z. Зупиняє процес, але його можна перехопити. |
| 21 | SIGTTIN | - | SIGTTIN | Фоновий процес хоче read() з термінала. |
| 22 | SIGTTOU | - | SIGTTOU | Фоновий процес хоче write() в термінал (якщо увімкнено tostop) |
| 23 | URG | - | SIGURG | Термінові дані в мережевому сокеті. |
| 24 | XCPU | - | SIGXCPU | Програма перевищила ліміт часу роботи процесора. |
| 25 | XFSZ | - | SIGXFSZ | Програма намагається створити файл, більший за дозволений ліміт. |
| 26 | VTALRM | - | SIGVTALRM | Віртуальний таймер (враховує тільки час, коли процес працював). |
| 27 | PROF | - | SIGPROF | Використовується для профайлінгу (вимірювання швидкості роботи коду). |
| 28 | WINCH | - | SIGWINCH | Зміна розміру вікна термінала. |
| 29 | POLL | - | SIGPOLL | Подія введення-виведення. |
| 30 | PWR | - | SIGPWR | Помилка живлення (наприклад, коли ДБЖ повідомляє про розряд батареї). |
| 31 | SYS | - | SIGSYS | Неправильний системний виклик. |
| 33 | reserved | - | SIGCANCEL | Використовуються NPTL (Native POSIX Thread Library). Використовується бібліотекою для скасування потоків. |
| 33 | reserved | - | SIGSETXID | Використовуються NPTL (Native POSIX Thread Library).Використовується для синхронізації змін ідентифікаторів користувача/групи (UID/GID) між усіма потоками одного процесу. |
| 34 | - | SIGRTMIN | SIGRTMIN | - |
| 35 | - | - | SIGRTMIN+1 | - |
| .. | - | - | SIGRTMIN+.. | - |
| 64 | - | SIGRTMAX | SIGRTMIN+30 | - |
systemctl
systemctl є головним інструментом для керування системою ініціалізації systemd.
Коли ви віддаєте команду systemctl, вона не просто “вбиває” процес, а намагається керувати ним цивілізовано.
systemctl stop \[service\]
Це найчастіша операція. Systemd діє за певним алгоритмом:
SIGTERM(15). Це “ввічливе” прохання завершити роботу. Програма отримує сигнал і має час, щоб зберегти файли, закрити з’єднання з базою даних і вийти самостійно.- Очікування (Timeout). Systemd чекає (за замовчуванням 90 секунд).
SIGKILL(9). Якщо програма не закрилася за відведений час,systemdнадсилає “контрольний постріл”, який завершує процес миттєво без збереження даних.
systemctl restart \[service\]
Працює точно так само, як stop, а після повного завершення процесу запускає його знову.
systemctl reload \[service\]
Ця команда не зупиняє програму. Вона зазвичай надсилає сигнал SIGHUP (1). Більшість
серверів (як-от Nginx або Apache) налаштовані так, що при отриманні SIGHUP
вони перечитують свої конфігураційні файли, не перериваючи обслуговування користувачів.
| Команда systemctl | Сигнал за замовчуванням | Мета |
|---|---|---|
| stop | SIGTERM | Безпечне завершення. |
| kill | SIGTERM(або інший вказаний) | Негайне надсилання сигналу всій групі процесів. |
| reload | SIGHUP | Оновлення конфігурації без перезапуску. |
| (якщо завис) | SIGKILL | Примусове завершення після таймауту. |
Налаштування сигналів у .service файлі
KillSignal= Вказує, який сигнал надіслати першим при зупинці (systemctl stop). За замовчуванням це SIGTERM. Ви можете змінити його, наприклад, на SIGQUIT або SIGUSR1.RestartKillSignal= Який сигнал використовувати при перезавантаженні.FinalKillSignal= Який сигнал надіслати, якщо програма не закрилася вчасно (за замовчуванням SIGKILL). Його неможливо змінити на щось, що можна ігнорувати.ExecReload= Тут ви можете вказати команду, яка виконується при systemctl reload. Часто туди пишуть/bin/kill -HUP $MAINPID.
Як перевірити, що програма отримала сигнал від systemd?
Коли ви зміните файл сервісу, не забудьте оновити конфігурацію systemd:
Тепер ви можете перевірити логи вашої програми в реальному часі: