IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

WSLで始めるUbuntu

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第30回 シグナルについて知ろう (宮崎悟) 2021年4月

前回は環境変数と終了コードについて説明しました。今回は、シグナルについて説明します。

シグナル

シグナルとは、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はSIGTTINSIGTTOUSIGTSTPを無視します。

bashが起動した外部コマンドは、シグナルハンドラをbashの親プロセスから継承します。ジョブコントロールが有効でないときには、バックグラウンドジョブは、継承したシグナルハンドラに加えてSIGINTSIGQUITも無視します。コマンド置換の結果として実行されたコマンドは、キーボードで生成されたジョブ制御シグナル(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