Ctrl+C
で終了させるcliのアプリケーションは多々あり、例えばファイルの変更を検知して何かするようなアプリケーションなどで良く見かける。
ただその後処理行いたいときどうすればよいかわからなかったのでメモしておく。
今回の事象
command1
のあとにcommand2
を実行したい場合を考える。ここで場合でcommand1
はCtrl+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
を実行することが可能になる。