Skip to content
Latchkey

SIGKILL vs SIGTERM: プロセスが死ぬ2つの方法

SIGTERMは「シャットダウンしてください、クリーンアップの猶予があります」。SIGKILLは「あなたはもう死んだ」。一方はcatch可能; もう一方は不可。

どちらのシグナルもプロセスを終了させるが、礼儀と決定性が異なる。この区別は、多くのCIの挙動 - gracefulなキャンセル、OOM kill、シャットダウンでハングするプロセス - を説明する。

SIGTERM(シグナル15)

SIGTERMはデフォルトの、丁寧な終了要求だ。プロセスはハンドラをインストールしてそれをcatchし、バッファをflushし、接続を閉じ、クリーンに終了できる。行儀の良いシャットダウンはこう動く。SIGTERMを無視するプロセスは、単に動き続ける。

SIGKILL(シグナル9)

SIGKILLはcatch、ブロック、無視のいずれもできない。カーネルはクリーンアップの機会なくプロセスを即座に取り除く。これは最後の手段のツールだ - out-of-memory killerによるものを含め、プロセスが今すぐ死ぬべきときに使われる。

エスカレーションのパターン

オーケストレータやtimeoutは通常、まずSIGTERMを送り、猶予期間を待ち、プロセスが終了しなければSIGKILLへエスカレートする。つまりgracefulなシャットダウン中にハングするプロセスは強制的にkillされる - だから遅いシャットダウンは、想定内の停止をハードなkillに変えうる。

TERM then KILL after grace
timeout --signal=TERM --kill-after=10s 60s ./long-task

CIでどう現れるか

  • SIGTERM → exit 143、通常はキャンセル、timeout、preemption。
  • SIGKILL → exit 137、通常はOOM killer。
  • 143に続く137は、猶予期間が切れたことを意味する。

重要なポイント

  • SIGTERM(15)はcatch可能で、gracefulなクリーンアップを許す。
  • SIGKILL(9)は即時で、catch不可、そして最終的だ。
  • ツールはまずTERMを送り、猶予期間後にKILLへエスカレートする。
  • CIでは: TERM → exit 143、KILL → exit 137。

関連ガイド