Как вывести список всех доступных сигналов linux

Обновлено: 07.07.2024

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

Каждый сигнал имеет номер, и в этом списке они перечислены в порядку номеров. Таким образом HUP=1, INT=2 и т.д. Процесс может посылать эти сигналы другим процессам. Пользователи могут тоже самое.

Некоторые из сигналов использовались пользователями столь часто, что получили свои клавиатурные сокращения. Для просмотра этих сокращений посмотрите четыре последние строки вывода команды stty -e:

Символ "^" означает что вы должны нажать клавишу "ctrl", а затем указанную за ним букву. Обратите внимание, что три сигнала были привязаны к управляющим последовательностям:

  • ^C привязан к сигналу INT (сигнал 2)
  • ^\ привязан к сигналу QUIT (сигнал 3)
  • ^Z привязан к сигналу TSTP (сигнал 18, хотя здесь он называется susp)

Не путайте слово "kill" в выводе команды stty с сигналом KILL (сигнал 9). Комбинация ^U удаляет строку, а не шлет сигнал номер 9. Для того что бы в этом убедиться, напечатайте в командной оболочке длинную строку, а затем нажмите ^U.

Но как послать сигнал, который не имеет соответствующей комбинации клавиш? Используйте для этого команду kill.

Есть пара способов использования команды kill. Если вы просто напечатаете:

то по умолчанию процессу с идентификатором PID будет послан сигнал TERM. Если вы хотите послать какой-нибудь другой сигнал, то в команде укажите его название или номер:

Таким образом команды

эквивалентны. Не забывайте, что в UNIX имеет значение регистр набранных команд, если вы напечатаете:

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

Однако, вероятнее всего вы быстро утомитесь нажимать пробел и поймете, что на самом деле вам вовсе не хочется в данный момент просматривать список всех ваших файлов. Другими словами вам захочется подать прерывающий сигнал. Один из путей сделать это, нажать на терминале "Ctrl+C":

То, что на вашем терминале появится приглашение интерпретатора команд, свидетельствует о том, что посланный вами сигнал INT сработал.

Опять выполните ту же самую команду find, но в этот раз пошлите сигнал 3, нажав на клавиатуре "Ctrl+\":

Если теперь вы вернетесь на предыдущий терминал и посмотрите список файлов в каталоге, среди прочего вы обязательно найдете файл more.core. Обычно вам никогда не потребуется посылать процессу сигнал номер 3, если конечно вы не программист, который знает как использовать отладчик ядра. Я включил этот пример в статью для того что бы показать разницу между сигналами 2 и 3. Удаляйте core-файлы без опаски.

Межпроцессное взаимодействие (в оригинале используется термин "межпроцессные коммуникации" - прим. переводчика) практически ни чем не отличается от любых других видов коммуникаций: вы или какой-нибудь процесс можете послать сигнал в надежде на определенный результат, однако процесс получающий этот сигнал распоряжается с ним "на свое усмотрение". Помните, что процессы - это всего лишь запущенные программы. Большинство программ используют процедуры "обработки сигналов", применяемые для того, что бы решать что и как надо делать с поступившими сигналами в данный момент времени. Обычно, если вы посылаете процессу какой-нибудь из сигналов останавливающих выполнение программы, процедура обработки сигналов этого процесса пытается корректно закрыть все используемые программой файлы для предотвращения потери данных после останова. В некоторых случаях обработчик сигналов может просто проигнорировать поступивший процессу сигнал и отклонить запрос на останов программы (обычно так поступают зависшие программы, которые на момент поступления сигнала уже не работают должным образом - прим. переводчика).

Однако (к счастью - прим. переводчика), некоторые сигналы не могут быть проигнорированы программой. Это например девятый и семнадцатый сигналы. Представим, что вы хотите остановить процесс который вы некоторое время назад запустили. Воспользовавшись связкой команды ps и grep, вы узнали PID процесса, а затем при помощи команды kill послали ему сигнал TERM, а затем решили проверить остановлен ли процесс повторив команду ps:

Однако при повторе команды ps вы опять обнаружили этот процесс в списке, а это значит, что по каким-то причинам сигнал TERM был проигнорирован. Любая из этих двух команд исправит ситуацию:

Если вы теперь повторите команду ps, то вы должны будете получить пустой список, что свидетельствует об успешном останове процесса.

Вы можете спросить: "Почему бы всегда не посылать процессам сигнал 9, если он не может быть игнорирован?". Дело в том, что сигнал 9 на самом деле просто "убивает" процесс, не давая ему времени на корректное сохранение всех обработанных данных, что означает, что при применении сигнала 9 могут быть потеряны данные (никогда не применяйте сигнал номер 9 без крайней на то необходимости - прим. переводчика). Намного лучше попробовать для начала послать процессу какой-нибудь другой сигнал останова, а сигнал номер 9 иметь "про запас" для процессов упрямо игнорирующих другие сигналы. Не забывайте так же, что если вы работаете от имени обычного пользователя, то вы сможете посылать сигналы только процессам, владельцем которых являетесь. Суперпользователь root может посылать сигналы любым процессам.

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

Продемонстрируем это. Войдите в систему на другом терминале и введите команду ps:

В этом примере я вошел в систему с терминалов 0, 1, 2, 3. Я запустил команду ps с консоли (терминал 0 по совместительству выполняет роль системной консоли - прим. переводчика), на первом терминале запущена оболочка командного процессора, на втором - запущен браузер lynx и на третьем у меня запущен сеанс X Window. И так я являюсь владельцем 10 процессов. Если в команде kill я воспользуюсь идентификатором процесса (PID) равным -1, я отправлю указанный в команде сигнал всем принадлежащим мне процессам. так попробуем послать сигнал TERM таким образом:

А теперь проверим результаты, воспользовавшись командой ps:

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

Если вы "пройдетесь" по тем четырем терминалам, на которых выполнялись ваши программы, то на трех из них вы увидите приглашение войти в систему. Последняя команда kill уничтожила все процессы, за исключением своего родительского процесса, т.е. командного интерпретатора C shell, в котором вы набрали команду kill (так произошло потому, что структура процессов в UNIX древовидна и каждый процесс должен иметь своего родителя - прим. переводчика).

Обратите внимание, что если вы допустите ошибку при наборе команды и напишете:

Дело в том, что -1 это специальный идентификатор процесса, который обозначает "все процессы", а 1 это идентификатор процесса с именем init. Только суперпользователь может останавливать процесс init. К тому же суперпользователь должен останавливать процесс init только при условии того, что он знает что делает.

Теперь давайте поглядим что произойдет, если мы повторим то же упражнение, но только от имени суперпользователя. Для начала на моем тестовом компьютере (где выполняются следующие программы: apache, mysql, squid, nfs и т.п.) я выполню команду ps:

Теперь я пошлю сигнал KILL специальному идентификатору -1 от имени суперпользователя:

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

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

Это является одной из причин, по которой только суперпользователь может выполнять команды reboot и halt. Когда одна из этих команд запускается на выполнение, то всем процессам рассылается сигнал TERM, для того что бы дать им шанс для сохранения данных, поскольку за сигналом TERM, через некоторое время, следует сигнал KILL, который посылается для того что бы гарантированно уничтожить все процессы.

В следующей статье я продолжу эту тему, заострив внимание на процессах init и getty.


Команда kill в Linux

PID — это PID (числовой идентификатор) процесса или несколько PID процессов, если требуется послать сигнал сразу нескольким процессам.

По умолчанию команда kill шлет сигнал KILL (он также называется SIGKILL и имеет числовое значение 9 ).

Опции

Задает сигнал, который будет послан процессу. Сигнал может задаваться числом или названием. Вывести список всех сигналов.
Если задано значение Сигнал , то вывод зависит от того, чему равно заданное значение Сигнал :
  • числовой номер сигнала — в таком случае будет выведено название сигнала;
  • название сигнала — в таком случае будет выведено числовое значение сигнала.
Вывести список сигналов в табличном виде. Выводится числовое значение и название каждого сигнала.

Примеры использования команды kill

Определить PID процесса

Определяем PID процесса. ps ef grep

Вывести список сигналов

Выведем список всех доступных сигналов:

В результате получим список сигналов и их числовые значения:

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

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

Пошлем сигнал SIGTERM процессу с PID 3012:

Отправка сигнала KILL (завершение процесса)

Пошлем сигнал KILL процессу с PID 3121, чтобы принудительно завершить процесс:

Или можно использовать числовое значение сигнала:

Отправка сигнала нескольким процессам

Выполним отправку сигнала KILL сразу нескольким процессам. Для этого необходимо перечислить их идентификаторы:

В Unix-подобных операционных системах, таких как Linux, сигналы программные прерывания. Они предоставляют пользователю (или процессу) возможность напрямую общаться с процессом.

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

  • Описание
  • Поиск системных сигналов
  • Сигналы в Linux
  • Примеры: отправка сигналов
  • Связанные команды
  • Справка по командам Linux

Описание

Сигналы процесса были разработаны как часть UNIX в 1970-х годах. Они используются во всех современных UNIX-подобных операционных системах, включая Linux, BSD и macOS X.

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

Сигналы можно отправлять с убийство команда, названная в честь сигнала по умолчанию (СИГКИЛЛ), который инструктирует ОС принудительно завершить процесс, прежде чем делать что-либо еще.

Названия сигналов обычно сокращаются без их SIG префикс, например, "KILL", включая аргументы команды убийство.

Поиск сигналов, доступных в вашей системе

Сигналы определены в системной библиотеке signal.h. Чтобы просмотреть сигналы, используемые вашей операционной системой, откройте терминал и запустите мужской сигнал или же человек 7 сигнал.

Сигналы в Linux

Сигналы, не поддерживаемые Linux

Следующие сигналы могут использоваться другими системами, такими как BSD, но интерпретируются как SIGUNUSED в Linux.

SIGEMTВ ЕМТ сигнал отправляется процессу, когда происходит ловушка эмулятора. Не используется в Linux.
СИГИНФОВ ИНФОРМАЦИЯ сигнал отправляется процессу при получении запроса состояния от управляющего терминала. Не используется в Linux
СИГЛОСТВ ПОТЕРЯННЫЙ сигнал отправляется процессу при потере блокировки файла. Не используется в Linux.
SIGSYSВ SYS сигнал отправляется процессу, когда он передает неверный аргумент системному вызову. Не используется в Linux.

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

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

Ctrl-Cпослать SIGINT (Прерывание). По умолчанию это приводит к завершению процесса.
Ctrl-Zпослать SIGTSTP (Приостановить). По умолчанию это заставляет процесс приостанавливать все операции.
Ctrl- послать SIGQUIT (Уволиться). По умолчанию это приводит к немедленному завершению процесса и дампу ядра.
Ctrl-Tпослать СИГИНФО (Информация). По умолчанию при этом операционная система отображает информацию о команде. Поддерживается не во всех системах.

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

Сигналы в реальном времени - это набор сигналов без определенной цели, которые программисты могут использовать в своем программном обеспечении по своему усмотрению. Два названия сигналов, SIGRTMIN и SIGRTMAX, определите минимальное и максимальное количество сигналов для сигналов реального времени. Например, программист может использовать номер сигнала как SIGRTMIN + 3 для обозначения четвертого номера сигнала реального времени.

Примеры: отправка сигналов с помощью команды kill

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

Сигнализируемый процесс называется PID (ID процесса). Если вы не уверены в идентификаторе процесса, вы можете найти его с помощью пс команда, например ps -aux.

убить 123 456 789

Убить три процесса: PID 123, 456, и 789.

убить -15 1234 5678

Номер сигнала отправки 15 (СРОК) к процессам 1234 и 5678.

kill -TERM 1234 5678

То же, что и предыдущая команда.

Список всех доступных сигналов. Пример вывода:

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) SIGTERM 16) 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) SIGPWRIN 31) SIGPWRINTM 35) SIGPWRINTM 35) SIGPWRINTM 35) SIGPWRINTM 35) 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

Идентификатор специального процесса -1 относится ко всем процессам, кроме убийство и системный корневой процесс. Эта команда попытается убить (-9) всевозможный процесс (-1) в системе. Для получения дополнительной информации см. Документацию убийство, ссылка ниже.

Связанные команды

убийство - Завершить процесс.
stty - Измените настройки терминальной линии.


Сигналы использовались еще с Bell Labs UNIX в 1970 и сегодня официально определено стандартом POSIX. Когда сигнал поступает на процесс, операционная система прерывает нормальный поток выполнения процесса и обеспечивает уведомление.

Команды kill и сигналы

Вы можете просмотреть все сигналы с помощью команды:

kill -l на macos

kill -l на macos

kill -l на centos

kill -l на centos

kill -l на Debian

kill -l на Debian

Я постараюсь рассказать о всех сигналах, но для самого начала поговорим только о самых важных и часто использующихся.

Основные сигналы

Следующие сигналы являются частью стандарта POSIX. Каждый сигнал макрос, определенный в <signals.h> Файл заголовка системы. Они, как правило, сокращенны, без их SIG- префикса; например SIGHUP часто называют просто как HUP.

SIGKILL – сигнал SIGKILL заставляет процесс прекратить выполнение своей работы немедленно. Программа не может игнорировать этот сигнал. Несохраненный прогресс будет потерян.

Синтаксис команды такой:

Если вы не знаете какой нужно использовать PID приложения которого следует избавиться, то запустите команду:

А если знаете конкретное приложение (например apache), то можно отсеять ненужное и вывести все процессы по данной службе:

И это отобразит все запущенные приложения вместе с его PID-ом(ами).

Например, чтобы убить приложение, я выполните следующую команду:

Перезагурзить конфигурационные файлы или перезапуск утилит:

Особенно полезными сигналы включают HUP, INT, kill, STOP, CONT, и 0.

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

-l [exit_status]
Если операнд не указан, то показать имена сигналов; В противном случае, написать название сигнала, соответствующего exit_status.

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

-signal_number
Неотрицательное десятичное целое, задающее сигнал для отправки в TERM по умолчанию.

Следующие PID-ы, имеют особое значение:
-1 Если суперпользователь, то транслирует сигнал всем процессам; в противном случае вещает на все процессыbelong-
ing для пользователя.

Некоторые из наиболее часто используемых сигналов:

PKill

Так как он соответствует шаблону регулярного выражения, вы также можете ввести часть имени процесса, например:

pgrep -l

Killall

В Gnome, вы можете перезапустить Nautilus с помощью команды:

xkill

Еще сигналы которые используются

SIGABRT

Этот сигнал посылает сигнал процессу, чтобы прервать операцию. ABRT как правило, направлен на сам процесс, когда он вызывает функцию abort() языка программирования С, чтобы сигнализировать аварийное завершение, но он может быть направлен из любого процесса, как и любой другой сигнал.

SIGALRM, SIGVTALRM и SIGPROF

ALRM, VTALRM и / или сигнал PROF отправляется процессу, когда лимит времени, указанный при вызове функции сигнализации (например, setitimer) истекает.

ALRM

Посылается, когда настоящее время или часы с течением времени.

VTALRM

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

PROF

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

SIGBUS

BUS сигнал посылает процессу, когда это приводит к ошибке шины. Условия, которые приводят к данному сигналу, например, неправильное выравнивание доступа к памяти или отсутствие физического адреса.

SIGCHLD

SIGCONT

Сигнал CONT инструктирует операционную систему, и дает сигнал перезапустить процесс который ранее был приостановлен в режиме СТОП или сигнала TSTP. Одной из важных особенностей этого сигнала является контроль работы в оболочке Unix.

SIGFPE

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

SIGHUP

SIGILL

ILL сигнал, посылаемый процессу при попытке выполнить вредоносные, неизвестные или привилегированные команды (инструкции).

SIGINT

SIGKILL

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

SIGPIPE

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

SIGQUIT

QUIT сигнал посылается процессу от его управляющего терминала, когда пользователь запрашивает процесс выполнения дампа.

SIGSEGV

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

SIGSTOP

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

SIGTERM

SIGTSTP

Сигнал TSTP посылается в процесс его управляющего терминала и говорит ему, что нужно временно приостановить. Это обычно инициируется пользователем нажатием Control-Z. В отличие от SIGSTOP, этот процесс может зарегистрировать обработчик сигнала или чтобы игнорировать сигнал.

SIGTTIN и SIGTTOU

В TTIN и TTOU сигналы посылаются процессу, когда он пытается прочитать или записать соответственно с (tty) терминала на заднем плане. Как правило, этот сигнал может быть получен только с помощью процессов находящихся под контролем рабочей панели; демоны не имеют управляющие терминалы и никогда не должны получать этот сигнал.

SIGUSR1 и SIGUSR2

Сигналы USR1 и USR2 отправляются процессу и указывают определенные пользователем условия.

SIGPOLL

Сигнал POLL отправляется в процессе, когда происходит асинхронное событие ввода / вывода.

SIGSYS

Сигнал SYS отправляется в процессе, когда он пропускает плохой аргумент для системного вызова.

SIGTRAP

SIGURG

Сигнал URG отправляется процессу, когда socket имеет срочные или вне диапазона данных, доступных для чтения.

SIGXCPU

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

SIGXFSZ

Сигнал XFSZ отправляется в процессе, когда файл вырастает (превышает заданное значение), чем максимально допустимое значение.

SIGRTMIN to SIGRTMAX

Разные сигналы

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

SIGEMT

Сигнал ЕМТ отправляется в процессе, когда происходит прерывание эмулятора.

SIGINFO

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

SIGPWR

Сигнал PWR отправляется в процессе, когда система испытывает сбой питания.

SIGLOST

SIGWINCH

Сигнал WINCH отправляется в процессе, когда его управляющий терминал меняет свой размер.

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

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

CTRL-C

CTRL-Z

CTRL-\

CTRL-T

вывод

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Читайте также: