5.3 シグナル
Signals
シグナルはプロセス間通信の一種で、プロセスに対してイベントを通知する。終了、停止、再読込などの制御に使用される。
主要シグナル
| 番号 | 名前 | 説明 | キー |
|---|---|---|---|
| 1 | SIGHUP | 端末切断、設定再読込 | - |
| 2 | SIGINT | 割り込み(終了) | Ctrl+C |
| 9 | SIGKILL | 強制終了(キャッチ不可) | - |
| 15 | SIGTERM | 終了要求(デフォルト) | - |
| 18 | SIGCONT | 停止プロセスを再開 | - |
| 19 | SIGSTOP | 停止(キャッチ不可) | - |
| 20 | SIGTSTP | 端末からの停止 | Ctrl+Z |
シグナル送信
# 番号で指定
kill -9 12345
kill -SIGKILL 12345
# 名前で指定
kill -TERM 12345
kill -HUP 12345
# シグナル一覧
kill -l
# 名前でプロセス終了
killall nginx
pkill -9 python
# 設定再読込(デーモン)
kill -HUP $(cat /var/run/nginx.pid)
systemctl reload nginx # systemd環境
シグナルの動作
@startuml
!theme plain
skinparam backgroundColor #FEFEFE
rectangle "シグナル受信" as Recv #FEF3C7
rectangle "ハンドラ定義あり?" as Check #DBEAFE
rectangle "デフォルト動作" as Default #E5E7EB {
rectangle "終了" as Term
rectangle "無視" as Ignore
rectangle "停止" as Stop
}
rectangle "カスタムハンドラ\n実行" as Custom #D1FAE5
Recv --> Check
Check --> Default : なし
Check --> Custom : あり
note right of Custom
trap コマンドで定義
例: trap "echo caught" SIGINT
end note
note bottom of Default
SIGKILL, SIGSTOP は
キャッチ・無視不可
end note
@enduml
図1: シグナル受信時の処理フロー
trap(シグナルハンドラ)
#!/bin/bash
# SIGINT (Ctrl+C) をキャッチ
trap 'echo "Interrupted!"; exit 1' SIGINT
# 終了時のクリーンアップ
trap 'rm -f /tmp/myapp.pid' EXIT
# シグナル無視
trap '' SIGTERM
# ハンドラ解除
trap - SIGINT
# 実用例: 一時ファイル削除
cleanup() {
rm -f "$tmpfile"
exit
}
trap cleanup EXIT SIGINT SIGTERM
tmpfile=$(mktemp)
# 処理...
出典
[1] man 7 signal - overview of signals.
[2] Bash Reference Manual - Signals.
[2] Bash Reference Manual - Signals.