Перейти к содержимому

Какие сигналы нельзя перехватить в linux

  • автор:

Какие сигналы нельзя перехватить Linux?

Сигналы SIGKILL и SIGSTOP нельзя перехватывать, блокировать или игнорировать. Когда уничтожается процесс или серия процессов, разумно начать с попытки использовать менее опасный сигнал SIGTERM.

Как работают сигналы Django?

Django включает в себя «диспетчер сигналов», который помогает разделенным приложениям получать уведомления о действиях, происходящих в других частях фреймворка. В двух словах, сигналы позволяют определенным отправителям уведомлять набор получателей о том, что произошло какое-то действие.

Для чего нужно Signals в Django?

Django включает в себя «диспетчер сигналов», который помогает развязанным приложениям получать уведомления, когда действия происходят где-то в другом месте фреймворка. Короче говоря, сигналы позволяют определенным отправителям уведомить набор получателей о том, что произошло какое-то действие.

Можно ли перехватить Sigkill?

Сигналы SIGKILL и SIGSTOP нельзя перехватывать, блокировать или игнорировать.

Использование команды trap в Bash

Сценарий командной оболочки может столкнуться с проблемами во время его выполнения, что приведет к появлению сигнала об ошибке, неожиданно прерывающего выполнение сценария.

Ошибки возникают из-за неправильной разработки сценария, действий пользователя или сбоев в системе. Сбойный сценарий может оставить после себя временные файлы, которые могут вызвать проблемы при перезапуске сценария.

linux

Синтаксис команды Bash trap

Синтаксис команды trap следующий:

Команда состоит из следующих компонентов:

  • Опции обеспечивают дополнительную функциональность команды.
  • Аргументы — это команды, которые trap выполняет при обнаружении сигнала. Если команда не состоит из одного слова, она должна быть заключена в кавычки (» «). Если аргумент содержит более одной команды, разделяйте их точкой с запятой (;).
  • Сигналы — это асинхронные уведомления, посылаемые системой, обычно указывающие на прерывание работы, вызванное пользователем или связанное с системой. Сигналы можно вызывать по их имени или номеру.

Параметры команды Bash trap

Команда trap принимает следующие опции:

  • -p — Отображает команды сигналов.
  • -l — Выводит список всех сигналов и их номера.

Ниже приведен полный список 64 сигналов и их номера:

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
17 SIGCHLD
18 SIGCONT
19 SIGSTOP
20 SIGTSTP
21 SIGTTIN
22 SIGTTOU
23 SIGURG
24 SIGXCPU
25 SIGXFSZ
26 SIGVTALRM
27 SIGPROF
28 SIGWINCH
29 SIGIO
30 SIGPWR
31 SIGSYS
32 SIGWAITING
33 SIGLWP
34 SIGRTMIN
35 SIGRTMIN+1
36 SIGRTMIN+2
37 SIGRTMIN+3
38 SIGRTMIN+4
39 SIGRTMIN+5
40 SIGRTMIN+6
41 SIGRTMIN+7
42 SIGRTMIN+8
43 SIGRTMIN+9
44 SIGRTMIN+10
45 SIGRTMIN+11
46 SIGRTMIN+12
47 SIGRTMIN+13
48 SIGRTMIN+14
49 SIGRTMIN+15
50 SIGRTMAX-14
51 SIGRTMAX-13
52 SIGRTMAX-12
53 SIGRTMAX-11
54 SIGRTMAX-10
55 SIGRTMAX-9
56 SIGRTMAX-8
57 SIGRTMAX-7
58 SIGRTMAX-6
59 SIGRTMAX-5
60 SIGRTMAX-4
61 SIGRTMAX-3
62 SIGRTMAX-2
63 SIGRTMAX-1
64 SIGRTMAX

Сигналы 32 и 33 не поддерживаются в Linux, и команда trap -l не отображает их в выводе.

Сигналы, наиболее часто используемые с командой trap, следующие:

  • SIGHUP (1) — очистка
  • SIGINT (2) — прерывание
  • SIGQUIT (3) — Выход из системы
  • SIGABRT (6) — Отмена
  • SIGALRM (14) — Будильник
  • SIGTERM (15) — Завершение работы

Префикс SIG в именах сигналов является необязательным. Например, сигнал SIGTERM также может быть записан как TERM.

Как использовать команду trap в Bash

Типичным сценарием использования команды trap является перехват сигнала SIGINT. Этот сигнал посылается системой, когда пользователь прерывает выполнение сценария нажатием Ctrl+C.

Следующий пример скрипта печатает слово «Test» каждую секунду, пока пользователь не прервет его выполнение нажатием Ctrl+C. Затем скрипт печатает сообщение и завершает работу.

Цикл while в приведенном выше примере выполняется бесконечно. Первая строка сценария содержит команду trap и инструкции по ожиданию сигнала SIGINT, затем вывод сообщения и выход из сценария.

Команда trap часто используется для очистки временных файлов, если сценарий завершается из-за прерывания. Следующий пример определяет функцию очистки, которая печатает сообщение, удаляет все файлы, добавленные в переменную $TRASH, и завершает работу сценария.

Ловушка в приведенном примере выполняет функцию очистки, когда обнаруживает один из четырех сигналов: SIGHUP, SIGINT, SIGQUIT или SIGABRT. Сигналы обозначаются их номерами.

Вы также можете использовать ловушку, чтобы гарантировать, что пользователь не сможет прервать выполнение сценария. Эта возможность важна при выполнении чувствительных команд, прерывание которых может привести к необратимому повреждению системы. Синтаксис для отключения сигнала следующий:

Двойные кавычки означают, что ни одна команда не будет выполнена. Например, чтобы отловить сигналы SIGINT и SIGABRT, введите:

Если вы хотите снова включить сигналы в любое время в ходе выполнения сценария, сбросьте правила с помощью символа тире:

Сигнал SIGKILL нельзя перехватить. Он всегда немедленно прерывает выполнение сценария.

Какие сигналы нельзя перехватить в linux

В вашей системе есть страница man, на которой перечислены все имеющиеся сигналы, но доступ к этой странице происходит по-разному в зависимости от того, какая у вас операционная систем. В большинстве систем Linux страницу можно открыть с помощью команды man 7 signal. Если возникнут проблемы, то найдите точное месторасположение страницы man с помощью команды

Имена сигналов можно получить с помощью команды kill -l .

Сигналы в вашей командной оболочке Bash

Когда отсутствуют какие-либо команды trap, интерактивная оболочка Bash игнорирует сигналы SIGTERM и SIGQUIT. Сигнал SIGINT перехватывается и обрабатывается, и если осуществляется управление заданиями, то также игнорируются сигналы SIGTTIN, SIGTTOU и SIGTSTP. Если эти сигналы поступают от клавиатуры, то команды, участвующие в подстановке команд, также игнорируют эти сигналы.

По сигналу SIGHUP по умолчанию происходит выход из командной оболочки. Интерактивная оболочка отправит сигнал SIGHUP всем заданиям, работающим или остановленным; если вы хотите отменить такое действие для конкретного процесса, которое задается по умолчанию, смотрите документацию по встроенной команде disown. Во встроенной команде shopt укажите параметр huponexit для уничтожения всех заданий, принимающих сигнал SIGHUP.

Посылаем сигнал в командной оболочке

В оболочке Bash можно посылать следующие сигналы:

Таблица 12.1. Управляющие сигналы в Bash

Сигнал прерывания, отправляет сигнал SIGINT заданию, работающему в приоритетном режиме.

Сигнал задержанной приостановки. Вызывает остановку работающего процесса, когда он попытается прочитать из терминала входные данные. Управление возвращается в командную оболочку, причем пользовательский процесс может оставаться приоритетным, фоновым или может быть уничтожен. Задержанную приостановку можно использовать только в тех операционных системах, где эта функция поддерживается.

Сигнал приостановки, посылается SIGTSTP в работающую программу, что ведет к остановке программы и возвращению управления в командную оболочку.

Проверьте настройки вашего терминала stty. Приостановка и возобновление выдачи выходных данных отключена, если вы используете эмуляцию «современных» терминалов. Стандартный терминал xterm по умолчанию поддерживает Ctrl+S и Ctrl+Q.

Использование сигналов с функцией kill

В большинстве современных командных оболочек, к которым относится Bash, есть встроенная функция kill. В Bash в качестве параметров можно указывать имена и номера сигналов, а аргументами могут быть задания или идентификаторы процессов. Состояние кода возврата можно получить с помощью параметра -l : ноль, если успешно отправлен хотя бы один сигнал, и не ноль, если произошла ошибка.

Когда используется команда kill из /usr/bin в вашей системе, то в команде могут быть дополнительные возможности, позволяющие уничтожать процессы с идентификатором не вашего, а другого пользователя, и указывать процессы по именам, точно также, как в pgrep и pkill.

Если ничего не задано, то оба варианта команды kill посылают сигнал TERM.

Это список наиболее распространенных сигналов:

Таблица 12.2. Наиболее распространенные сигналы

Прерывание с клавиатуры

Сигналы SIGKILL и SIGSTOP нельзя перехватывать, блокировать или игнорировать.

Когда уничтожается процесс или серия процессов, разумно начать с попытки использовать менее опасный сигнал SIGTERM. Таким образом, программам, которым важно правильное их завершение, предоставляется шанс следовать процедурам, которые создаются для случаев, когда программы получают сигнал SIGTERM, например, процедурам уборки мусора и закрытия открытых файлов. Если вы посылаете в процесс сигнал SIGKILL, все шансы сделать в этом процессе аккуратную уборку мусора и остановку могут быть потеряны и это может привести к плачевным последствиям.

Но если чистое завершение не работает, единственным способом остаются сигналы INT или KILL. Например, когда процесс не уничтожается с помощью нажатия клавиш Ctrl+C, то лучше использовать kill -9 и указать идентификатор процесса:

Когда процесс запускает несколько экземпляров, проще воспользоваться командой killall. В ней используются те же самые параметры, как и в команде kill, но она применяется ко всем экземплярам данного процесса. Испытайте эту команду прежде, чем ей воспользоваться на практике, поскольку в некоторых коммерческих версиях UNIX она может работать не так, как ожидается.

Какие сигналы нельзя перехватить в linux

Оглавление книги Популярные страницы Скачать книгу Купить книгу

Книга: Linux программирование в примерах

10.3.1. Функция signal()

10.3.1. Функция signal()

Действие сигнала изменяется с помощью функции signal() . Вы можете изменить действие на «игнорировать сигнал», «восстановить для сигнала действие системы по умолчанию» или «вызвать при появлении сигнала мою функцию с номером сигнала в качестве параметра».

Функция, которую вы предоставляете для распоряжения сигналом, называется обработчиком сигнала (или просто обработчиком), а установка ее в соответствующем месте осуществляет перехват (catch) сигнала.

Получив эти сведения, давайте перейдем к API. В заголовочном файле <signal.h> представлены определения макросов для поддерживаемых сигналов и объявления функций управления сигналами, предоставляемыми стандартом С:

#include <signal.h> /* ISO С */
void (*signal(int signum, void (*func)(int)))(int);

Это объявление для функции signal() почти невозможно прочесть. Поэтому справочная страница GNU/Linux signal(2) определяет ее таким способом:

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

Теперь это более вразумительно. Тип sighandler_t является указателем на функцию с возвращаемым типом void , которая принимает один целый аргумент. Это целое является номером поступающего сигнала.

Функция signal() принимает номер сигнала в качестве своего первого параметра, а указатель функции (новый обработчик) в качестве своего второго аргумента. Если последний не является указателем функции, он может быть лишь SIG_DEF, что означает «восстановить действие по умолчанию», либо SIG_IGN , что означает «игнорировать сигнал».

signal() изменяет действие для signum и возвращает предыдущее действие. (Это дает вам возможность восстановить при желании предыдущее действие.) Возвращаемое значение может равняться также SIG_ERR , что указывает на произошедшую ошибку. (Некоторые сигналы невозможно перехватить или игнорировать; предоставление для них обработчика сигнала или неверный signum создают эту ошибку.) В табл. 10.1 перечислены сигналы, доступные под GNU/Linux, их числовые значения, действия по умолчанию для каждого, формальный стандарт или современная операционная система, которые их определяют, и смысл каждого.

Таблица 10.1. Сигналы GNU/Linux

Имя Значение По умолчанию Источник Смысл
SIGHUP 1 Term POSIX Отсоединение
SIGINT 2 Term ISO C Прерывание
SIGQUIT 3 Core POSIX Выход
SIGILL 4 Core ISO C Недействительная инструкция
SIGTRAP 5 Core POSIX Трассировочная ловушка
SIGABRT 6 Core ISO C Прекращение
SIGIOT 6 Core BSD Ловушка IOT
SIGBUS 7 Core BSD Ошибка шины
SIGFPE 8 Core ISO C Исключение с плавающей точкой
SIGKILL 9 Term POSIX Завершение, неблокируемый
SIGUSR1 10 Term POSIX Сигнал 1 пользователя
SIGSEGV 11 Core ISO C Нарушение сегмента
SIGUSR2 12 Term POSIX Сигнал 2 пользователя
SIGPIPE 13 Term POSIX Нарушенный канал
SIGALRM 14 Term POSIX Аварийные часы
SIGTERM 15 Term ISO C Завершение
SIGSTKFLT 16 Term Linux Ошибка стека в процессоре (не используется)
SIGCHLD 17 Ignr POSIX Изменение статуса порожденного процесса
SIGCLD 17 Ignr System V То же, что и SIGCHLD (для совместимости)
SIGCONT 18 POSIX Продолжить при остановке
SIGSTOP 19 Stop POSIX Стоп, неблокируемый
SIGTSTP 20 Stop POSIX Стоп от клавиатуры
SIGTTIN 21 Slop POSIX Фоновое чтение от tty
SIGTTOU 22 Stop POSIX Фоновая запись в tty
SIGURG 23 Ignr BSD Срочный сигнал сокета
SIGXCPU 24 Core BSD Превышение предела процессора
SIGXFSZ 25 Core BSD Превышение предела размера файла
SIGVTALRM 26 Term BSD Виртуальные аварийные часы
SIGPROF 27 Term BSD Профилирующие аварийные часы
SIGWINCH 28 Ignr BSD Изменение размера окна
SIGIO 29 Term BSD Возможен ввод/вывод
SIGPOLL 29 Term System V Опрашиваемое событие, то же, что и SIGIO (для совместимости)
SIGPWR 30 Term System V Повторный запуск из-за сбоя питания
SIGSYS 31 Core POSIX Неверный системный вызов

Обозначения: Core: Завершить процесс и создать снимок образа процесса Ignr: Игнорировать сигнал Stop: Остановить процесс. Term: Завершить процесс.

Более старые версии оболочки Борна ( /bin/sh ) непосредственно связывали с номерами сигналов ловушки (traps), которые являются обработчиками сигналов на уровне оболочки. Таким образом, всесторонне образованному Unix-программисту нужно было знать не только имена сигналов для использования в коде С, но также и соответствующие номера сигналов! POSIX требует, чтобы команда trap понимала символические имена сигналов (без префикса ‘ SIG ‘), поэтому этого больше не требуется. Однако (главным образом для лучшего разбирательства), мы предоставили эти номера в интересах полноты из-за того, что однажды вам может понадобиться иметь дело со сценарием оболочки, созданным до POSIX, или с древним кодом на С, которые непосредственно используют номера сигналов.

ЗАМЕЧАНИЕ. Для некоторых более новых сигналов, от 16 и выше, соответствующие номера сигнала и их имена на различных платформах не обязательно совпадают! Проверьте заголовочные файлы и справочные страницы на своей системе. Табл. 10.1 верна для GNU/Linux

Некоторые системы определяют также и другие сигналы, такие, как SIGEMT , SIGLOST и SIGINFO . Справочная страница GNU/Linux signal(7) предоставляет полный список; если ваша программа должна обработать сигналы, не поддерживаемые GNU/Linux, это можно сделать с помощью #ifdef :

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *