SIGTERMがbashを終了できますが、ashまたはdashを終了できないのはなぜですか?

SIGTERMがbashを終了できますが、ashまたはdashを終了できないのはなぜですか?

比較bashashは次のようにしてのみ終了できdashます。bashSIGTERM

kill -TERM <pid>

そしてash私はbash必要SIGHUPですSIGKILL

kill -HUP <pid>
kill -KILL <pid>

その理由は何ですか?また、動作はシステムによって異なります。

  • bashSIGTERMUbuntu 14.04 Trusty, Ubuntu 16.04 Xenial, Ubuntu 18.04 Bionic, Ubuntu 19.10 Eoan, Ubuntu 20.04 Focal, Debian 8 Jessie, Debian 9 Stretch, Debian 10 Buster, CentOS 8
  • bashはいいいえSIGTERMCentOS 6、CentOS 7で終了

答え1

これは、bashが行readline編集ライブラリを使用してユーザー入力を待っている場合にのみ発生します。bash

実行すると、Aはbash --noediting死ぬことはなく、SIGTERM自分で死ぬこともありません。bashkill -TERM $$

readline()これは、ユーザー入力を受け取るbash関数が独自のシグナルハンドラをインストールしてSIGTERM返す前に元のシグナル処理を復元するためです。ユーザー入力を待っている間に発生した場合に返されますSIGTERMreadlinereadline()NULL

readline()()を呼び出すbash関数はreturnをと解釈しyy_readline_get()てシェルを終了します。これはとても似ています。NULLEOF回答

SIGTERMこれは、インタラクティブなbashが設定でも生き残ることができることを意味しますIGNOREEOF;-):

$ bash
$ IGNOREEOF=10
$ echo $$
11096
<kill -TERM 11096 from another terminal>
$ Use "exit" to leave the shell.
<kill -TERM 11096 from another terminal>
$ Use "exit" to leave the shell.
...
<the 10th will get it>
$ exit
$

答え2

これは私に予想外のことでしたが、いくつかのビルドを実行した後、gitのbashの最新のコードでは再現できますが、bash 4.0では再現できないことがわかりました。したがって、これはgit bisect次のコミットが責任があると識別するのに役立ちます。

% git bisect good                     
ac50fbac377e32b98d2de396f016ea81e8ee9961 is the first bad commit
commit ac50fbac377e32b98d2de396f016ea81e8ee9961
Author: Chet Ramey <[email protected]>
Date:   Wed Feb 26 09:36:43 2014 -0500

    Bash-4.3 distribution sources and documentation

Bashの個々のgitコミットはかなり大きな傾向があり、範囲はそれほど厳しくありません。しかし、コミットを探索するのに数分しか投資しないと、SIGTERMが迂回しなければならない新しいrl_signal_event_hookを含む、readlineがSIGTERMを処理する方法に対するいくつかの変更が明らかになります。多数の新しい私たちはSIGTERMをチェックして場所を呼び出しますtermsig_handler

これらの変更の一部は、変更ログの新しいエントリと一致します。

Readlineは、入力を読み取っている間に信号を受信した後(読み取りは-1 / EINTRを返しますが、readlineはすぐに信号を処理しません)、アプリケーションが設定したイベントフック(rl_signal_event_hook)を呼び出してアプリケーションが信号を処理または書き込みますできるようにします。 SIGHUP または SIGTERM は現在呼び出されていません。

今回のニュースで見ると、このような行動の変化は意図的なものではないかもしれないと思います。

これが意図的なものかどうかを確認するために、この投稿をバグベースのメーリングリストに配信する予定です。

関連情報