シグナル
プロセス間の非同期通知
シグナルとは
シグナルは、プロセスに非同期に通知を送る仕組みです。 プロセスの終了要求、一時停止、再開、設定再読み込みなどに使用されます。 カーネルやユーザー、他のプロセスから送信できます。
主要なシグナル
| 番号 | 名前 | 説明 | デフォルト動作 |
|---|---|---|---|
| 1 | SIGHUP | 端末切断、設定再読み込み | 終了 |
| 2 | SIGINT | 割り込み(Ctrl+C) | 終了 |
| 3 | SIGQUIT | コアダンプ付き終了(Ctrl+\) | コアダンプ+終了 |
| 9 | SIGKILL | 強制終了(捕捉不可) | 終了 |
| 15 | SIGTERM | 終了要求(デフォルト) | 終了 |
| 18 | SIGCONT | 再開 | 再開 |
| 19 | SIGSTOP | 停止(捕捉不可) | 停止 |
| 20 | SIGTSTP | 一時停止(Ctrl+Z) | 停止 |
| 10/12 | SIGUSR1/2 | ユーザー定義 | 終了 |
SIGTERM vs SIGKILL
SIGTERM (15)
- • 「終了してください」のお願い
- • 捕捉可能
- • クリーンアップ処理が可能
- • graceful shutdown
- • kill のデフォルト
SIGKILL (9)
- • 「今すぐ死ね」の強制
- • 捕捉不可
- • クリーンアップなし
- • データ損失の可能性
- • 最後の手段として使用
ベストプラクティス: まずSIGTERM → 数秒待機 → 応答なければSIGKILL
シグナルの送信
1 # kill コマンド 2 kill <PID> # SIGTERM(デフォルト) 3 kill -15 <PID> # SIGTERM(明示) 4 kill -9 <PID> # SIGKILL 5 kill -HUP <PID> # SIGHUP(設定再読み込み) 6 7 # シグナル名で指定 8 kill -s SIGTERM <PID> 9 10 # 全シグナル一覧 11 kill -l 12 13 # プロセス名で送信 14 pkill nginx # 名前でSIGTERM 15 pkill -9 nginx # 名前でSIGKILL 16 killall nginx # 全マッチにSIGTERM 17 18 # プロセスグループに送信 19 kill -TERM -<PGID> 20 21 # Ctrl+C, Ctrl+Z 22 # Ctrl+C → SIGINT 23 # Ctrl+Z → SIGTSTP 24 # Ctrl+\ → SIGQUIT
シグナルハンドリング
プロセスはシグナルに対して3つの対応が可能です(SIGKILL/SIGSTOP除く):
デフォルト動作
カーネル定義の動作を実行
捕捉(ハンドラ)
独自の処理を実行
無視
シグナルを無視
1 # Bashでのシグナルハンドリング 2 trap 'echo "SIGINT received"; exit 1' SIGINT 3 trap 'echo "cleaning up..."; rm -f /tmp/lockfile' EXIT 4 5 # シグナル無視 6 trap '' SIGINT # Ctrl+C を無視 7 8 # デフォルトに戻す 9 trap - SIGINT
シグナルの実用例
SIGHUP: 設定再読み込み
kill -HUP nginx でnginxの設定をリロード
SIGUSR1: ログローテート
kill -USR1 nginx でログファイル再オープン
SIGTERM: graceful shutdown
処理中のリクエストを完了してから終了
SRE/インフラ観点
Kubernetes との関連
- • Pod終了時: SIGTERM → terminationGracePeriod → SIGKILL
- • preStop hookでクリーンアップ処理
- • アプリケーションはSIGTERMを適切に処理すべき
トラブルシューティング
- • SIGKILLでも終了しない → D状態(I/O待ち)の可能性
- • シグナル無視設定の確認:
cat /proc/PID/status | grep Sig