【 trap 】コマンド――シグナルを受け取った際の動作を設定するLinux基本コマンドTips(324)

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、シグナルを受け取った際の動作を設定、表示する「trap」コマンドです。

» 2019年07月25日 05時00分 公開
[西村めぐみ@IT]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、シグナルを受け取った際の動作を設定、表示する「trap」コマンドです。

trapコマンドとは?

 「trap」はシグナルを受け取った際の動作を設定、表示するコマンドです。

 例えば、シェルスクリプトの中で、キーボードからの割り込みシグナル(SIGINT)に対応する動作をtrapコマンドで設定することにより、[CTRL]+[C]キーを押したときの動作を変更できます(シグナルについては、Linux再入門第16回を参照)。

 bashの内部コマンド(ビルトインコマンド、シェルコマンド)であるため、「man」コマンドではなく、「help」コマンドで詳細を表示できます。



trapコマンドの書式

trap 実行したいコマンド シグナル

trap -p [シグナル]

trap [-l]

※[ ]は省略可能な引数を示しています。





trapの主なオプション

短いオプション 意味
-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


画面1 画面1 SIGINTシグナルを受け取ったときの動作を決め、実行したところ

 画面2画面3では、シェルスクリプトの中で「trap "" SIGINT」を実行したときと、していないときの動作の違いを比較しています。

 画面2では「sleep 10」で10秒間待機した後に「echo "FIN"」を実行しています。「sleep」コマンドは、指定した秒数だけ何も実行しないというコマンドで、[CTRL]+[C]キーを使って中断できます。

 画面3では、画面2のスクリプトに加えて、先頭で「trap "" SIGINT」を実行しています。[CTRL]+[C]キーではスクリプトが中断しなくなっている様子が分かりました。

画面2 画面2 [CTRL]+[C]でシェルスクリプトを中断できた
画面3 画面3 [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

(現在の全ての設定を表示する)


画面4 画面4 trapコマンドによるシグナル設定を表示したところ


筆者紹介

西村 めぐみ(にしむら めぐみ)

元々はDOSユーザーで「DOS版UNIX-like tools」を愛用。ソフトハウスに勤務し生産管理のパッケージソフトウェアの開発およびサポート業務を担当、その後ライターになる。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。地方自治体の在宅就業支援事業にてMicrosoft Officeの教材作成およびeラーニング指導を担当。会社などの"PCヘルパー"やピンポイント研修なども行っている。


Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。