2013-07-10 6 views
1

Команда kill $$ должен убить текущего Баш, но мне кажется, что он не работает:

$ ps -p $$ 
    PID TTY   TIME CMD 
18179 pts/4 00:00:00 bash 
$ kill $$ 
$ ps -p $$ 
    PID TTY   TIME CMD 
18179 pts/4 00:00:00 bash 

Почему?

+0

где вы читали, что 'kill $$' должен убивать текущий bash? – Antarus

+0

возможно это может 'kill \' ps -p $$ | awk 'NR == 2 {print $ 1}' \ '' – Antarus

+2

кроме того, почему бы не просто «выйти»? – anishsane

ответ

7

Я не уверен, почему хотелось бы kill текущей оболочки. Тем не менее ...

kill PID отправил SIGTERM, если не указан никакой сигнал. bash игнорирует SIGTERM и SIGQUIT при отсутствии каких-либо ловушек.

Вы достичь желаемого эффекта, если вы должны были сказать

kill -9 $$ 

или

kill -SIGKILL $$ 

Цитирование из manual:

Когда Bash является интерактивным, в отсутствие каких-либо ловушек, оно игнорирует SIGTERM (так что «kill 0» не убивает интерактивную оболочку), и SIGINT поймано и обработано (так, что построитель ожидания прерывается). Когда Bash получает SIGINT, он вырывается из любых циклов . Во всех случаях Bash игнорирует SIGQUIT.

+0

+1. Я многому учусь из ваших ответов, ты такой эксперт в этих темах. То, что мне не ясно, - это значение «bash игнорирует SIGTERM и SIGQUIT при отсутствии каких-либо ловушек». Не могли бы вы объяснить это немного дальше? – fedorqui

+3

Я иногда убиваю -9 $$ ', чтобы избежать добавления списка команд в файл истории. Я мог вручную редактировать файл истории, но иногда это становится сокращением. Грязный способ сделать это. – anishsane

+0

Он относится к встроенному 'trap', который может * улавливать * сигналы. – devnull

0

Когда вы посылаете процесс любому сигналу с помощью команды kill, процесс может выбрать обработку сигнала в соответствии с его желанием. (Существует несколько сигналов, которые не могут быть обработаны.)

Когда вы используете kill $$, вы на самом деле передаете сигнал = 15 (SIGTERM). Процесс может обрабатываться процессом.

Вы можете google для linux signal example знать КАК он реализован.

& Чтобы ответить на ваш вопрос: Если передать не-handlable сигнал, как SIGKILL (9) или SIGSTOP (19), она будет соответственно убить/остановить запущенный процесс Баш.

Смежные вопросы