Ctrl+Cで終了した後に処理を行う(shell)

Ctrl+Cで終了させるcliのアプリケーションは多々あり、例えばファイルの変更を検知して何かするようなアプリケーションなどで良く見かける。

ただその後処理行いたいときどうすればよいかわからなかったのでメモしておく。

今回の事象

command1のあとにcommand2を実行したい場合を考える。ここで場合でcommand1Ctrl+Cで終了するタイプのコマンドであるとする。

まず、素朴に以下のように書いてみても当然ながらcommand2は実行されない。

#!/bin/sh
command1
command2

Ctrl+C押下時に何が起こっているのか

Unix系のOSにはシグナルというプロセス間通信の方法がある。その中でもCtrl+Cを押した場合はSIGINT(2)が該当プロセスに対して発行される。killコマンドを用いると

$ kill -SIGINT {PID}

と同じことである。SIGINTを受信したアプリケーションは多くの場合適切な処理を行った後とプロセスを終了してしまうのだが、先の例のようにスクリプトを組んだ場合、SIGINTはcommand1とスクリプト本体の両者に送信される。

trapコマンド

これを解決する方法としてtrapコマンドがある。このコマンドで何らかのシグナルを受け取ったときの動きを定義できる。すなわち

#!/bin/sh
trap 'command2' SIGINT
command1

とすることでSIGINTを受け取ったあとにcommand2を実行することが可能になる。

Built with Hugo
Theme Stack designed by Jimmy