すぐにログアウトしたいときは、このようにしますkill -15 -1
。 bashがSIGTERMを無視することがわかりました。
知りたいこのbash動作の理由は何ですか?
正当な理由なしにSIGTERMを無視することはUNIXと非常に似ていませんか?
修正する:
すべての人に同じ(なし)効果があります。
$ kill -TERM $$
$ type kill
kill is a shell builtin
$ command kill -TERM $$
$ /bin/kill -TERM $$
アップデート2:
~から男乱交:
Bashがインタラクティブの場合、トラップなしでSIGTERMを無視します。
だからこれは意図的なものです。しかし、なぜ?
ベストアンサー1
まず第一に、これはbashに限定されません。 ATT ksh、dash、zsh は同じ方法で動作します。コマンドライン編集中にSIGTERMとSIGQUITを無視します。 mkshの場合は終了しませんが、SIGINTとして扱われます。
ksh マニュアルと bash マニュアルはどちらも、次の用語で SIGTERM を無視することを正当化します。
これにより、
kill 0
対話型シェルは終了しません。
kill 0
すべてのプロセスを終了プロセスグループシェルは1にあります。簡単に言うと、プロセスグループは、端末のフォアグラウンドで実行されているか、バックグラウンドでジョブがあるか、保留中のすべてのプロセスで構成されます。
より正確には、これが現代のシェルで起こるものです。職業管理。このようなシェルでは、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サーバーをシャットダウンするだけで十分ですが、そのためにはそのプロセスIDを見つける必要があります。テキストセッションで同じコマンドを使用するには、次のようにしますkill -15 -1; exit
。とにかくかなり危険な命令です。
1一般的なシェルマニュアルにはこれに言及していないようです。これは基本的なシステムコールの機能です。で明示的に言及POSIX仕様。
²今日これを行うには、jobs -l
タスクリストの表示とそのプロセスグループIDを実行してからkill -123 -456 …
プロセスグループを終了します。