web-dev-qa-db-ja.com

ターミナルを使用してシェルを殺す

echo $$ 

シェルのPIDを伝えます。したがって、このシェルを使用して殺す場合

kill 123 #suppose 123 is PID of Shell

実際には何も起こりません、私はそれを試しました。私は再び走った

echo $$

シェルは同じPIDで実行されていました。シェルが停止しないのはなぜですか?シェルが殺されたらどうなりますか?

2
luv.preet

主な理由は、TERMシグナルをトラップするためにシェルが構築されているためです。この動作は文書化されています。 bash 4.3マニュアルを引用するには:

信号

Bashは、トラップがない場合にインタラクティブである場合、SIGTERMを無視し(kill 0がインタラクティブシェルを強制終了しないように)、SIGINTがキャッチされて処理されます(ビルトイン待機が割り込み可能になるように)。すべての場合において、bashはSIGQUITを無視します。ジョブ制御が有効な場合、bashはSIGTTIN、SIGTTOU、およびSIGTSTPを無視します。

man killから:

KillのデフォルトのシグナルはTERMです。

kill -KILL $$を指定すると、実際にシェルが強制終了され、制御シェルが終了すると、ターミナルが閉じられます。オプション-9-KILLおよび-SIGKILLはすべて同じkill信号のエイリアスであり、これがこれら3つのいずれかが機能する理由であり、Siguzaが指摘したエイリアスの1つです。コメントでアウト。

M. Becerraが言ったこととは対照的に、ウィンドウPIDは常にシェルのものとは異なるため、これはウィンドウ自体とは関係ありません。

# Shell PID
$ cat /proc/self/status  | grep '^Pid:'                                                                                  
Pid:    7058
$ echo $$                                                                                                                
14709
# GUI window PID
$ xdotool getactivewindow getwindowpid 
2774
3