SIGTERM
とSIGKILL
のざっくりした理解
SIGTERM
とSIGKILL
をざっくり説明すると以下のとおり:
-
SIGTERM
: 終了要求のシグナル。プロセスはこれを受信後も動くことはできる。 -
SIGKILL
: 強制終了。プロセスはこれ以上動作できない。
グレイスフルシャットダウン (graceful shutdown)
グレイスフルシャットダウンとは、プロセスなどが、新規の作業の受付を締め切り、仕掛り途中の作業をキリのいいところまで処理してから安全に終了することを指します。イメージとしては、「店じまい」です。
強制終了が発生すると、システムの状態が中途半端になったり、データに不整合が起きてしまったりします。グレイスフルシャットダウンはそうならないようにする保護策です。
例えば、HTTPサーバのグレイスフルシャットダウンを例に考えると、HTTPサーバが終了フェーズに入ると、新規のリクエストは受け付けないようにしつつ、既に抱えているリクエストはちゃんとレスポンスを返し終わってから終了します。
DockerやKubernetesなどは、アプリケーションがグレイスフルシャットダウンできるように、SIGTERM
シグナルを送ったのち、一定の猶予期間経過後、それでも終了してなかったら、SIGKILL
を送信して強制終了するようになっています。
DockerやKubernetesなどのSIGTERM
からSIGKILL
までの猶予
猶予期間はシステムによって異なります。以下に各システムの猶予期間を列挙します。グレイスフルシャットダウンを実装するにあたってご参考にしてください。
docker stop
-
SIGTERM
を送り、10秒後にプロセスが残っていたらSIGKILL
を送る。- 10秒は
-t
,--time
オプションで変更可能。
- 10秒は
-
docker-compose stop
、docker-compose down
も同様。
docker kill
- 即座に
SIGKILL
を送る -
docker rm -f
,docker-compose kill
も同様。
KubernetesのPodの終了
-
SIGTERM
を送り、30秒後にプロセスが残っていたらSIGKILL
を送る。
Systemd
-
SIGTERM
→ 90秒後SIGKILL
Upstart
-
SIGTERM
→ 5秒後SIGKILL
Sysvinit
-
SIGTERM
→ 5秒後SIGKILL