Иногда, когда я хочу быстро выйти из системы, я делаю это kill -15 -1
. Я заметил, что bash игнорирует SIGTERM.
Интересно, в чем причина такого поведения bash ?
Не слишком UNIX'ы игнорировать SIGTERM без веской причины, не так ли?
ОБНОВИТЬ:
одинаковый (нет) эффект для всех:
$ kill -TERM $$
$ type kill
kill is a shell builtin
$ command kill -TERM $$
$ /bin/kill -TERM $$
UPDATE2:
От человека Баш :
Когда bash интерактивен, при отсутствии ловушек он игнорирует SIGTERM
Так сделано специально. Но почему?
/bin/kill
или оболочка встроенная? Если последнее, я предполагаю, что оболочка не убьет себя с помощью собственной встроенной функции.Ответы:
Во-первых, это не относится к Bash. ATT ksh, dash и zsh ведут себя одинаково: они игнорируют SIGTERM и SIGQUIT во время редактирования командной строки; что касается mksh, то он также не завершается, а обрабатывает их как SIGINT.
И руководство ksh, и руководство bash оправдывают игнорирование SIGTERM в следующих терминах:
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 …
убить группы процессов.источник
Это может ответить на ваш вопрос:
ИСТОЧНИК : Руководство GNU Bash
источник