
比較bash
とash
は次のようにしてのみ終了できdash
ます。bash
SIGTERM
kill -TERM <pid>
そしてash
私はbash
必要SIGHUP
ですSIGKILL
kill -HUP <pid>
kill -KILL <pid>
その理由は何ですか?また、動作はシステムによって異なります。
bash
SIGTERM
Ubuntu 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 8bash
はいいいえSIGTERM
CentOS 6、CentOS 7で終了
答え1
これは、bashが行readline
編集ライブラリを使用してユーザー入力を待っている場合にのみ発生します。bash
実行すると、Aはbash --noediting
死ぬことはなく、SIGTERM
自分で死ぬこともありません。bash
kill -TERM $$
readline()
これは、ユーザー入力を受け取るbash関数が独自のシグナルハンドラをインストールしてSIGTERM
返す前に元のシグナル処理を復元するためです。ユーザー入力を待っている間に発生した場合に返されますSIGTERM
。readline
readline()
NULL
readline()
()を呼び出すbash関数はreturnをと解釈しyy_readline_get()
てシェルを終了します。これはとても似ています。NULL
EOF
回答。
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 は現在呼び出されていません。
今回のニュースで見ると、このような行動の変化は意図的なものではないかもしれないと思います。
これが意図的なものかどうかを確認するために、この投稿をバグベースのメーリングリストに配信する予定です。