本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、シグナルを受け取った際の動作を設定、表示する「trap」コマンドです。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、シグナルを受け取った際の動作を設定、表示する「trap」コマンドです。
「trap」はシグナルを受け取った際の動作を設定、表示するコマンドです。
例えば、シェルスクリプトの中で、キーボードからの割り込みシグナル(SIGINT)に対応する動作をtrapコマンドで設定することにより、[CTRL]+[C]キーを押したときの動作を変更できます(シグナルについては、Linux再入門第16回を参照)。
bashの内部コマンド(ビルトインコマンド、シェルコマンド)であるため、「man」コマンドではなく、「help」コマンドで詳細を表示できます。
trap 実行したいコマンド シグナル
trap -p [シグナル]
trap [-l]
※[ ]は省略可能な引数を示しています。
短いオプション | 意味 |
---|---|
-p | 指定したシグナルに対する設定を表示する(シグナルを指定しなかった場合はtrapコマンドによる全ての設定を表示) |
-l | シグナル番号とシグナル名を一覧表示する |
「trap コマンド シグナル」で、シグナルを受け取った際に実行するコマンドを設定できます。「trap シグナル」で設定を削除します。
シグナルは数値またはシグナル名で指定します。シグナルの指定に使用できる値は「trap -l」で確認できます。なお、シグナル名のうち冒頭の「SIG」は省略可能です。
trapコマンドはシェルスクリプトの中で使用することが多いでしょう。
通常のシェルスクリプトであれば[CTRL]+[C]キーで処理を中断します。[CTRL]+[C]キーで発生するシグナルは「SIGINT」です。そこで、シェルスクリプトの中で「trap "" SIGINT」を実行すると、「SIGINTを受け取ったときに何も実行しない」、つまり、「[CTRL]+[C]キーを無視する」という動作を設定できます。
無視する以外にも、シェルスクリプトの中で、SIGINTに対応する動作を設定することで、[CTRL]+[C]キーを押したときの動作を決定できます(画面1)。
trap コマンド シグナル
(シグナルを受け取ったときに実行するコマンドを指定する)
trap "echo === CTRL+C ===" SIGINT
(SIGINTを受け取ったら「=== CTRL+C ===」と表示する。SIGINT部分はINTまたは2でも指定可能)(画面1)
画面2と画面3では、シェルスクリプトの中で「trap "" SIGINT」を実行したときと、していないときの動作の違いを比較しています。
画面2では「sleep 10」で10秒間待機した後に「echo "FIN"」を実行しています。「sleep」コマンドは、指定した秒数だけ何も実行しないというコマンドで、[CTRL]+[C]キーを使って中断できます。
画面3では、画面2のスクリプトに加えて、先頭で「trap "" SIGINT」を実行しています。[CTRL]+[C]キーではスクリプトが中断しなくなっている様子が分かりました。
「trap -p シグナル」で、シグナルに対する設定を確認できます(画面4、※1)。「trap -p」または「trap」で、trapコマンドを用いた現在の全ての設定を表示します。
※1 SIGTSTPは停止([CTRL]+[Z]キー)、SIGTTINとSIGTTOUはバックグラウンドジョブが端末に入出力を行おうとする際に発生するシグナル。CentOS 7やUbuntu 18.04 LTSでは、bashのマニュアルに「ジョブコントロールが有効な際には、これら3つのシグナルを無視する(If job control is in effect, bash ignores SIGTTIN, SIGTTOU, and SIGTSTP.)」とある。しかし、筆者が試した限り、コマンドラインで「set +m」としてジョブコントロールを無効にしても、これらのシグナルに対する設定を変更できなかった。なお、ノンインタラクティブシェルはデフォルトでジョブが無効なため、シェルスクリプト内ではこれらのシグナルに対する設定を変更できる。
trap -p シグナル
(指定したシグナルに対するtrapコマンドによる設定を表示する)
trap -p SIGINT
(SIGINTに対するtrapコマンドによる設定を表示する。SIGINT部分は「INT」または「2」でも指定可能)
trap
(現在の全ての設定を表示する)
西村 めぐみ(にしむら めぐみ)
元々はDOSユーザーで「DOS版UNIX-like tools」を愛用。ソフトハウスに勤務し生産管理のパッケージソフトウェアの開発およびサポート業務を担当、その後ライターになる。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。地方自治体の在宅就業支援事業にてMicrosoft Officeの教材作成およびeラーニング指導を担当。会社などの"PCヘルパー"やピンポイント研修なども行っている。
Copyright © ITmedia, Inc. All Rights Reserved.