SIGTERMとSIGKILLのほとんどの説明はSIGKILLを指します。
SIGTERM や SIGINT とは異なり、[...] はキャプチャまたは無視できません。 [...](ウィキペディア)
これがSIGTERMとSIGKILLの唯一の違いですか?特に、プロセスにSIGTERMハンドラがインストールされていない場合、SIGTERMまたはSIGKILLをプロセスに送信することに違いはありますか?
答え1
信号構成がない場合、およびSIGTERM
をSIGKILL
含む基本的な動作は、プロセスを終了する他の信号と同様に、少なくともプロセスが終了するという点で実質的に同じです。 〜のようにSIGUSR1
SIGUSR2
イルカチョ親プロセスが子プロセスを終了する信号について通知することを指摘しています。 (これはシェルが信号を区別して印刷する方法です。例えば「終了」v。 「ユーザー定義シグナル1」)。
ウィキペディアで述べたように、SIGKILL
返されるか無視することはできません。つまり、SIGTERM
プロセスが無効になるためにハンドラをインストールする必要はなく、SIGTERM
単にブロックまたは無視することができます。sighold()
とsigrelse()
sigignore()
)。
答え2
これがSIGTERMとSIGKILLの唯一の違いですか?
いいえ。
SIGKILL
aとuncaughtの大きな違いは、SIGTERM
前者も同様です。目覚めるでのみ使用できる停止されたプロセス(即時自己消滅可能)ですSIGCONT
。
簡単な例:
$ sleep 1000 & sleep 1; kill -TSTP $!
[1] 6455
[1]+ Stopped sleep 1000
$ kill -TERM 6455
$ jobs
[1]+ Stopped sleep 1000
$ kill -CONT 6455
$ jobs
[1]+ Terminated sleep 1000
TERM
、、、HUP
などINT
の信号が有効であることを確認するには、CONT
順序に関係なく信号とペアを設定する必要があります。
bash組み込みの魔法のため、人々はこれを簡単に理解できないかもしれません。または(または不正なpid)kill
などのジョブIDと組み合わせて使用すると、停止したプロセスを示します。%
%1
働く、そうです自分でやろうカーテンの後ろ:
/* Give PID SIGNAL. This determines what job the pid belongs to (if any).
If PID does belong to a job, and the job is stopped, then CONTinue the
job after giving it SIGNAL. Returns -1 on failure. If GROUP is non-null,
then kill the process group associated with PID. */
int
kill_pid (pid, sig, group)