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