Во-первых, это не относится к Bash. ATT ksh, dash и zsh ведут себя одинаково: они игнорируют SIGTERM и SIGQUIT во время редактирования командной строки; что касается mksh, то он также не завершается, а обрабатывает их как SIGINT.
И руководство ksh, и руководство bash оправдывают игнорирование SIGTERM в следующих терминах:
так что kill 0
не убивает интерактивную оболочку
kill 0
убивает все процессы в группе процессов , в которой находится оболочка¹. В двух словах, группа процессов состоит из всех процессов, выполняющихся на переднем плане в терминале, или всех процессов в фоновом или приостановленном задании.
Точнее, это то, что происходит в современных оболочках с контролем работы . В таких оболочках kill 0
это было бы бесполезно, поскольку оболочка находилась бы в отдельной группе процессов. Старые оболочки (или современные оболочки после set +m
) не создавали групп процессов для фоновых команд. Таким образом, вы можете использовать команду, kill 0
чтобы убить все фоновые команды, не выходя из системы. Таким образом, kill 0
обоснование выглядит как старое, которое в настоящее время более не оправдано, но сохранено для обратной совместимости.
Однако есть и другие подобные ситуации, в которых полезно сделать оболочку иммунной. Рассмотрим случай, когда у вас есть процессы, блокирующие терминал, и вы хотите уничтожить их, не выходя из системы. Во многих системах есть такой инструмент, pkill
который позволяет вам убивать процессы, запущенные на терминале. Вы можете запустить pkill -t $TTY
или pkill -QUIT -t $TTY
убить все процессы, запущенные на текущем терминале, кроме оболочки, которая игнорирует сигнал.
Оболочка обычно уходит либо когда пользователь выходит из нее (с помощью команды exit
или logout
), либо когда ее терминал сигнализирует об окончании ввода (пользователь может вызвать это нажатием Ctrl+ D), либо вообще уходит. В этом последнем случае оболочка получает сигнал SIGHUP и не игнорирует его.
Для вашего случая выхода из сеанса X это kill -15 -1
будет сделано, так как это убивает эмулятор терминала, в результате чего оболочка получает SIGHUP. На самом деле этого достаточно, чтобы убить X-сервер, но для этого необходимо найти его идентификатор процесса. Если вы хотите, чтобы та же команда работала в текстовом сеансе, вы можете использовать kill -15 -1; exit
. В любом случае, это очень опасная команда.
Seem Это, как правило, не упоминается в руководствах по оболочке; это особенность основного системного вызова. Это явно упоминается в спецификации POSIX .
² В настоящее время для этого запустите, jobs -l
чтобы увидеть список заданий с идентификатором их группы процессов, а затем kill -123 -456 …
убить группы процессов.
/bin/kill
или оболочка встроенная? Если последнее, я предполагаю, что оболочка не убьет себя с помощью собственной встроенной функции.