signalとは何か?OSからprocessへの通知
signalは、イベントを通知したり、停止などの動作を求めたりするために、オペレーティングシステムがprocessに送る短い非同期メッセージです。
signalは、オペレーティングシステムや別のprocessが、実行中のプログラムの肩を叩く手段です。「シャットダウンしてください」「割り込まれました」「メモリが足りなくなりました」。CIでは、signalはjobが時々突然停止する理由を説明します。timeoutやリソース制限がsignalを送り、それがprocessを終了させるのです。
signalとは何か
signalはprocessに配信される非同期の通知です。processは一部のsignalを処理でき(クリーンアップコードを実行)、一部を無視でき、キャッチできない他のsignalによって強制的に停止されることもあります。
よくあるsignal
- SIGINT (2): 割り込み、Ctrl-Cが送るもの。
- SIGTERM (15): 終了を求める丁寧な要求。
- SIGKILL (9): 即時かつキャッチ不能なkill。
- SIGHUP (1): hangup、多くの場合は親shellが閉じること。
キャッチ可能か不可能か
processはSIGTERMのhandlerをインストールしてデータをフラッシュし、きれいに終了できます。SIGKILLはキャッチも無視もできません。kernelがprocessを即座に停止し、クリーンアップの機会を与えません。
signalとexit code
signalがprocessを終了させると、shellは128 + signal番号のexit codeを報告します。したがってSIGKILL (9)で殺されたprocessは137で終了し、Ctrl-C (SIGINT, 2)で停止したものは130で終了します。
CIにおけるsignal
時間制限に達したCI jobには通常SIGTERMが送られ、停止しなければSIGKILLが送られます。メモリ不足によるkillもSIGKILLであり、これがexit code 137がしばしば「runnerがメモリ不足になった」を意味する理由です。
マネージドrunnerでのグレースフルシャットダウン
Latchkeyのrunnerは、破棄する前に終了signalを送り、行儀の良いステップにlogのフラッシュやクリーンアップのための一瞬を与えます。長時間実行されるステップでSIGTERMをトラップすると、プラットフォームが求めたときにきれいに終了できます。
重要なポイント
- signalは、動作を求めてprocessを中断するOSのメッセージです。
- SIGTERMは丁寧な停止要求で、SIGKILLはキャッチできません。
- signalで殺されたprocessは128 + signal番号で終了するため、SIGKILLは137になります。