Skip to content
Latchkey

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になります。

関連ガイド