Сигнал - команда Linux / Unix

click fraud protection

Linux поддерживает как надежные сигналы POSIX (далее «стандартные сигналы»), так и сигналы реального времени POSIX.

Использование сигналов в Linux

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

Начните с поиска процесса, который вы хотите завершить. Вы можете сделать это с помощью:

ps aux | grep -i 

Итак, если вы хотите закрыть Firefox из командной строки, введите:

ps aux | grep -i firefox

Вы получите огромный список процессов из Fire Fox потому что это многопоточное приложение. Найдите базовый процесс для / usr / lib / firefox. Обычно это первый.

Список процессов Linux Firefox

Если вас это беспокоит, вы также можете использовать pgrep. Он работает аналогично, но дает только идентификаторы процессов.

pgrep firefox. 

Самый низкий идентификатор процесса будет базовым процессом, который вам нужен.

Linux pgrep Firefox

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

SIGTERM сигнал процессу, чтобы остановить его, используя команда kill.

убить -SIGTERM 4790. 
Linux SIGTERM Firefox

Каждому сигналу также соответствует номер для сокращения. Номер для SIGTERM: 15, так что вы можете использовать это слово так же, как и полное слово.

убить -15 4790

SIGTERM на самом деле является действием по умолчанию для команды kill. В результате вам вообще не нужно его указывать. Просто используйте:

убить 4790

Вы получите точно такой же результат.

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

kill -l
Список сигналов Linux

Да, их много. К счастью, вы не коснетесь подавляющего большинства, если не начнете разрабатывать или писать сценарии системного администрирования. Чаще всего, когда SIGTERM не удается остановить неотвечающий процесс, вы обращаетесь к Linux-эквиваленту Ctrl + Alt + Delete, СИГКИЛЛ.

В отличие от печально известного диспетчера процессов Ctrl + Alt + Delete, SIGKILL действительно работает. Фактически, это означает игнорирование всех других факторов и прекращение процесса нарушения, несмотря ни на что. Это также означает, что SIGKILL может быть опасен, если вы ошибетесь в процессе.

Начните точно так же, найдя идентификатор процесса.

pgrep firefox

Теперь вместо использования SIGTERM для остановки процесса используйте более разрушительный SIGKILL.

kill -SIGKILL 4790

Даже если процесс полностью заблокирован, он должен завершиться в течение нескольких секунд.

Linux SIGKILL Firefox

Как и в случае с SIGTERM, есть номер, соответствующий SIGKILL. В данном случае это 9.

убить -9 4790

Как и раньше, процесс должен быть остановлен почти сразу.

Вы также должны знать о SIGINT. Это прерывание с клавиатуры, и это больше команд, чем вы думаете в командной строке. Когда вы нажимаете Ctrl + C чтобы остановить процесс из окна терминала, вы фактически выдаете SIGINT. Его код 2, и вы можете использовать его, как и другие, с помощью команды kill.

убить -2 4790

Это не так уж часто, потому что вы с большей вероятностью выберете Ctrl + C, но хорошо об этом знать.

Это, безусловно, наиболее распространенные сигналы, с которыми вы столкнетесь при повседневном использовании Linux. Для более подробной технической разбивки других сигналов перейдите к следующему разделу.

Технические детали

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

Стандартные сигналы

Linux поддерживает стандартные сигналы, перечисленные ниже. Некоторые номера сигналов зависят от архитектуры, как указано в столбце «Значение». (Если даны три значения, первое обычно действительно для alpha и sparc, среднее - для i386, ppc и sh, а последнее - для mips. A - означает, что сигнал отсутствует на соответствующей архитектуре.)

Записи в столбце «Действие» таблицы определяют действие по умолчанию для сигнала, а именно:

Срок: Действие по умолчанию - завершить процесс.

Игн: Действие по умолчанию - игнорировать сигнал.

Основной: Действие по умолчанию - завершить процесс и выгрузить ядро.

Стоп: Действие по умолчанию - остановить процесс.

Во-первых, сигналы, описанные в исходном стандарте POSIX.1.

Сигнал Ценить Действие Комментарий
или смерть контролирующего процесса
SIGINT 2 Срок Прерывание с клавиатуры
SIGQUIT 3 Основной Выйти с клавиатуры
СИГИЛЛ 4 Основной Незаконная инструкция
SIGABRT 6 Основной Отменить сигнал от прервать(3)
SIGFPE 8 Основной Исключение с плавающей запятой
СИГКИЛЛ 9 Срок Убить сигнал
SIGSEGV 11 Основной Неверная ссылка на память
SIGPIPE 13 Срок Сломанная труба: писать в трубу без читателей
SIGALRM 14 Срок Сигнал таймера от тревога(2)
SIGTERM 15 Срок Сигнал завершения
SIGUSR1 30,10,16 Срок Определяемый пользователем сигнал 1
SIGUSR2 31,12,17 Срок Определяемый пользователем сигнал 2
SIGCHLD 20,17,18 Игн Ребенок остановлен или прекращен
SIGCONT 19,18,25 Продолжить, если остановлено
SIGSTOP 17,19,23 Стоп Остановить процесс
SIGTSTP 18,20,24 Стоп Прекратить печатать на tty
SIGTTIN 21,21,26 Стоп ввод tty для фонового процесса
SIGTTOU 22,22,27 Стоп вывод tty для фонового процесса

Сигналы СИГКИЛЛ а также SIGSTOP не могут быть пойманы, заблокированы или проигнорированы.

Далее сигналы не в стандарте POSIX.1, но описанные в SUSv2 и SUSv3 / POSIX 1003.1-2001.

Сигнал Ценить Действие Комментарий
SIGPOLL Срок Опрашиваемое событие (Sys V). Синоним SIGIO
SIGPROF 27,27,29 Срок Таймер профилирования истек
SIGSYS 12,-,12 Основной Плохой аргумент для процедуры (SVID)
SIGTRAP 5 Основной Ловушка трассировки / точки останова
СИГУРГ 16,23,21 Игн Срочное состояние на розетке (4.2 BSD)
SIGVTALRM 26,26,28 Срок Виртуальный будильник (4.2 BSD)
SIGXCPU 24,24,30 Основной Превышено ограничение по времени ЦП (4.2 BSD)
SIGXFSZ 25,25,31 Основной Превышен предел размера файла (4.2 BSD)

До Linux 2.2 включительно поведение по умолчанию для SIGSYS, SIGXCPU, SIGXFSZ, и (на архитектурах, отличных от SPARC и MIPS) SIGBUS должен был прервать процесс (без дампа ядра). (В некоторых других Unix-системах действие по умолчанию для SIGXCPU а также SIGXFSZ означает завершение процесса без дампа ядра.) Linux 2.4 соответствует требованиям POSIX 1003.1-2001 для этих сигналов, завершая процесс с помощью дампа ядра.

Далее различные другие сигналы.

Сигнал Ценить Действие Комментарий
SIGEMT 7,-,7 Срок
SIGSTKFLT -,16,- Срок Ошибка стека на сопроцессоре (не используется)
SIGIO 23,29,22 Срок Теперь возможен ввод-вывод (4.2 BSD)
SIGCLD -,-,18 Игн Синоним SIGCHLD
SIGPWR 29,30,19 Срок Сбой питания (Система V)
СИГИНФО 29,-,- Синоним SIGPWR
СИГЛОСТ -,-,- Срок Блокировка файла потеряна
SIGWINCH 28,28,20 Игн Сигнал изменения размера окна (4.3 BSD, Sun)
SIGUNUSED -,31,- Срок Неиспользованный сигнал (будет SIGSYS)

(Сигнал 29 есть СИГИНФО / SIGPWR на альфе, но СИГЛОСТ на спарке.)

SIGEMT не указан в POSIX 1003.1-2001, но, тем не менее, появляется в большинстве других Unix-систем, где его действие по умолчанию обычно заключается в завершении процесса с помощью дампа ядра.

SIGPWR (который не указан в POSIX 1003.1-2001) обычно игнорируется по умолчанию в тех других Unix, где он появляется.

SIGIO (который не указан в POSIX 1003.1-2001) по умолчанию игнорируется в некоторых других Unix.

Сигналы в реальном времени

Linux поддерживает сигналы реального времени, как первоначально определено в расширениях реального времени POSIX.4 (и теперь включено в POSIX 1003.1-2001). Linux поддерживает 32 сигнала в реальном времени, пронумерованных от 32 (SIGRTMIN) до 63 (SIGRTMAX). (Программы всегда должны обращаться к сигналам в реальном времени с использованием обозначений SIGRTMIN+ n, так как диапазон номеров сигналов в реальном времени варьируется в разных Unix.)

В отличие от стандартных сигналов, сигналы реального времени не имеют заранее определенного значения: весь набор сигналов реального времени может использоваться для целей, определенных приложением. (Обратите внимание, однако, что реализация LinuxThreads использует первые три сигнала реального времени.)

Действие по умолчанию для необработанного сигнала реального времени - завершить процесс приема.

Сигналы в реальном времени различаются по следующим параметрам:

  1. Можно поставить в очередь несколько экземпляров сигналов в реальном времени. Напротив, если доставляется несколько экземпляров стандартного сигнала, в то время как этот сигнал в настоящее время заблокирован, то в очередь помещается только один экземпляр.
  2. Если сигнал отправляется с использованием sigqueue(2), сопутствующее значение (целое число или указатель) может быть отправлено с сигналом. Если получающий процесс устанавливает обработчик для этого сигнала с помощью SA_SIGACTION флаг подписание(2) то он может получить эти данные черезsi_value поле siginfo_t структура передается обработчику как второй аргумент. Кроме того, вкусный а также si_uid поля этой структуры могут использоваться для получения PID и реального идентификатора пользователя процесса, отправляющего сигнал.
  3. Сигналы в реальном времени доставляются в гарантированном порядке. Несколько сигналов одного типа в реальном времени доставляются в том порядке, в котором они были отправлены. Если процессу отправляются разные сигналы реального времени, они доставляются, начиная с сигнала с наименьшим номером. (То есть, сигналы с низким номером имеют наивысший приоритет.)

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

Согласно POSIX, реализация должна разрешать как минимум _POSIX_SIGQUEUE_MAX (32) сигналов реального времени помещаться в очередь для процесса. Однако вместо того, чтобы устанавливать ограничение для каждого процесса, Linux налагает общесистемное ограничение на количество сигналов реального времени в очереди для всех процессов. Это ограничение можно просмотреть (и с правами) изменить с помощью /proc/sys/kernel/rtsig-max файл. Связанный файл,/proc/sys/kernel/rtsig-max, можно использовать, чтобы узнать, сколько сигналов в реальном времени находится в очереди.

В СООТВЕТСТВИИ С.

POSIX.1.

Использовать человек команда (% человек), чтобы увидеть, как команда используется на вашем конкретном компьютере.