CTC 教育サービス
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes
前回は環境変数と終了コードについて説明しました。今回は、シグナルについて説明します。
シグナルとは、Linuxを含むUNIXライクOSで使用される、プロセスへ数値(シグナル値)を渡します。プロセスはシグナルハンドラによってシグナル値を受け取ることにより、その挙動を変えることが出来ます。シグナルを送るにはkill コマンドを使用してkill PID
(プロセスID)のように実行します。killコマンドは、デフォルトでシグナルSIGINTを渡します。kill コマンドに -シグナル名
もしくは-値
を与えると、任意のシグナルをプロセスへ送信可能です。bashが扱うシグナルには、以下のような名称/値があります。
シグナル | 値 | 説明 |
---|---|---|
SIGHUP | 1 | 端末のハングアップ検出、もしくは制御しているプロセスの死亡 |
SIGINT | 2 | キーボードからの割り込み |
SIGQUIT | 3 | キーボードによる中止 |
SIGILL | 4 | 不正な命令 |
SIGTRAP | 5 | 何らかのデバッグ機能で使用される |
SIGABRT | 6 | 関数 abort() からの中断 (Abort) シグナル |
SIGFPE | 8 | 浮動小数点例外 |
SIGKILL | 9 | Kill シグナル |
SIGSEGV | 11 | 不正なメモリー参照 |
SIGPIPE | 13 | パイプ破壊、読込み先の無いパイプへの書出し |
SIGALRM | 14 | 関数 alarm() からのタイマーシグナル |
SIGTERM | 15 | 強制終了 (termination) シグナル |
SIGTTIN | 21 | バックグラウンドプロセスが端末から読もうとした |
SIGTTOU | 22 | バックグラウンドプロセスが端末に書き込もうとした |
SIGUSR1 | 30,10,16 | ユーザー定義シグナル 1 |
SIGUSR2 | 31,12,17 | ユーザー定義シグナル 2 |
SIGCHLD | 19,18,25 | 子プロセスの一時停止 (stop) または終了 |
bashにおけるシグナルの動作は、ジョブコントロールが有効/無効時で動作が異なります。ジョブコントロールとは、実行するプロセスをサスペンド/レジュームする機能のことです。ジョブコントロールの詳細については、次回説明します。
bashがインタラクティブかつ(組み込みコマンドtrap
などにより)シグナルハンドラを指定されていないとき、bashはSIGTERMを無視し、SIGINTは捕捉し処理します。したがって組み込みコマンドのwait
は割り込み可能です。どんな場合でも、bashはSIGQUITを無視します。ジョブコントロールが有効な状態ならば、bashはSIGTTIN、SIGTTOU、SIGTSTPを無視します。
bashが起動した外部コマンドは、シグナルハンドラをbashの親プロセスから継承します。ジョブコントロールが有効でないときには、バックグラウンドジョブは、継承したシグナルハンドラに加えてSIGINTとSIGQUITも無視します。コマンド置換の結果として実行されたコマンドは、キーボードで生成されたジョブ制御シグナル(SIGTTIN/SIGTTOU/SIGTSTP)を無視します。
デフォルトでは、bashはSIGHUPを受け取ると終了します。終了する前には、bashは実行中/停止中の全てのジョブに対してSIGHUPを再送信します。停止中のジョブにはSIGCONTが送られ、このジョブがSIGHUPを受け取るようにします。特定のジョブに対してシェルからシグナルが送られないようにするためには、2種類の方法があります。
disown
を使って、そのジョブをジョブテーブルから削除します。disown -h
を使って、SIGHUPを受け取らないようにマークを付けます。シェルオプションのhuponexitがshoptを使って設定されていた場合、対話的なログインシェルが終了するときに、bashはSIGHUPを全てのジョブに送ります。コマンドの完了を待っている間に、トラップが設定されたシグナルをbashが受け取ったとき、そのトラップはコマンドが完了するまで実行されません。bashが組み込みコマンドwait
を使って非同期コマンドを待っているときに、シグナルハンドラが設定されているシグナルを受け取ると、組み込みコマンドwait
は即座に復帰させられます。この際の終了ステータスは128より大きい値になります。また復帰するのはシグナルハンドラが実行された直後です。
今回はシグナルについて説明しました。次回はジョブコントロールについて説明します。次回をお楽しみに。
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes