はじめに
シェルスクリプトは、実行中に問題が発生し、スクリプトを予期せず中断するエラー信号が発生する可能性があります。
エラーは、スクリプトデザインの誤り、ユーザーアクション、またはシステム障害が原因で発生します。スクリプトが失敗すると、一時ファイルが残り、ユーザーがスクリプトを再起動したときに問題が発生する可能性があります。
このチュートリアルでは、 trap
の使用方法を説明します スクリプトが常に予測どおりに終了するようにするコマンド。
前提条件
- 端末/コマンドラインへのアクセス。
- テキストエディタ(Nano、Vi / Vimなど)。
Bashトラップの構文
トラップ
の構文 コマンドは次のとおりです:
trap [options] "[arguments]" [signals]
このコマンドには次のコンポーネントがあります。
- オプション コマンドに追加機能を提供します。
- 引数 コマンドは
trap
信号を検出すると実行されます。コマンドが1語のみの場合を除き、引用符(""
)で囲む必要があります。 )。引数に複数のコマンドが含まれている場合は、セミコロン(;
)で区切ります。 。 - 信号 システムによって送信される非同期通知であり、通常、ユーザーが生成した、またはシステム関連の中断を示します。信号は、名前または番号で呼び出すことができます。
バッシュトラップオプション
トラップ
コマンドは次のオプションを受け入れます:
-
-p
-信号コマンドを表示します。 -
-l </ code>
-すべての信号とその番号のリストを印刷します。
以下は、64個の信号とその番号の完全なリストです。
# | 信号 | # | 信号 | # | 信号 |
---|---|---|---|---|---|
1 | SIGHUP | 23 | SIGURG | 45 | SIGRTMIN + 11 |
2 | SIGINT | 24 | SIGXCPU | 46 | SIGRTMIN + 12 |
3 | SIGQUIT | 25 | SIGXFSZ | 47 | SIGRTMIN + 13 |
4 | SIGILL | 26 | SIGVTALRM | 48 | SIGRTMIN + 14 |
5 | SIGTRAP | 27 | SIGPROF | 49 | SIGRTMIN + 15 |
6 | SIGABRT | 28 | SIGWINCH | 50 | SIGRTMAX-14 |
7 | SIGBUS | 29 | SIGIO | 51 | SIGRTMAX-13 |
8 | SIGFPE | 30 | SIGPWR | 52 | SIGRTMAX-12 |
9 | SIGKILL | 31 | SIGSYS | 53 | SIGRTMAX-11 |
10 | SIGUSR1 | 32 | SIGWAITING | 54 | SIGRTMAX-10 |
11 | SIGSEGV | 33 | SIGLWP | 55 | SIGRTMAX-9 |
12 | SIGUSR2 | 34 | SIGRTMIN | 56 | SIGRTMAX-8 |
13 | SIGPIPE | 35 | SIGRTMIN + 1 | 57 | SIGRTMAX-7 |
14 | SIGALRM | 36 | SIGRTMIN + 2 | 58 | SIGRTMAX-6 |
15 | SIGTERM | 37 | SIGRTMIN + 3 | 59 | SIGRTMAX-5 |
16 | SIGSTKFLT | 38 | SIGRTMIN + 4 | 60 | SIGRTMAX-4 |
17 | SIGCHLD | 39 | SIGRTMIN + 5 | 61 | SIGRTMAX-3 |
18 | SIGCONT | 40 | SIGRTMIN + 6 | 62 | SIGRTMAX-2 |
19 | SIGSTOP | 41 | SIGRTMIN + 7 | 63 | SIGRTMAX-1 |
20 | SIGTSTP | 42 | SIGRTMIN + 8 | 64 | SIGRTMAX |
21 | SIGTTIN | 43 | SIGRTMIN + 9 | ||
22 | SIGTTOU | 44 | SIGRTMIN + 10 |
トラップ
で最も一般的に使用される信号 コマンドは次のとおりです:
-
SIGHUP(1)
-片付けをきれいにする -
SIGINT(2)
-割り込み -
SIGQUIT(3)
-終了 -
SIGABRT(6)
-キャンセル -
SIGALRM(14)
-目覚まし時計 -
SIGTERM(15)
-終了
Bashでトラップを使用する方法
トラップ
を使用するための一般的なシナリオ コマンドがSIGINT
をキャッチしています 信号。この信号は、ユーザーが Ctrl + Cを押してスクリプトの実行を中断したときにシステムから送信されます。 。
次のスクリプト例は、「 Test」という単語を出力します。 "ユーザーがCtrl+ Cで割り込むまで毎秒 。次に、スクリプトはメッセージを出力して終了します。
trap "echo The script is terminated; exit" SIGINT
while true
do
echo Test
sleep 1
done
while
上記の例のループは無限に実行されます。スクリプトの最初の行には、トラップ
が含まれています コマンドとSIGINT
を待つための指示 信号を送ってから、メッセージを出力してスクリプトを終了します。
トラップ
コマンドは、スクリプトが中断のために終了した場合に一時ファイルをクリーンアップするために頻繁に使用されます。次の例では、クリーンアップ
を定義しています。 メッセージを出力する関数は、 $ TRASH
に追加されたすべてのファイルを削除します 変数であり、スクリプトを終了します。
$TRASH=$(mktemp -t tmp.XXXXXXXXXX)
trap cleanup 1 2 3 6
cleanup()
{
echo "Removing temporary files:"
rm -rf "$TRASH"
exit
}
...
トラップ
上記の例では、クリーンアップ
を実行します 次の4つの信号のいずれかを検出すると機能します: SIGHUP
、 SIGINT
、 SIGQUIT
、または SIGABRT
。信号は番号で参照されます。
トラップ
を使用することもできます ユーザーがスクリプトの実行を中断できないようにするため。この機能は、中断によってシステムに恒久的な損傷を与える可能性のある機密性の高いコマンドを実行する場合に重要です。信号を無効にするための構文は次のとおりです。
trap "" [signal]
二重引用符は、コマンドが実行されないことを意味します。たとえば、 SIGINT
をトラップするには およびSIGABRT
信号、タイプ:
trap "" SIGINT SIGABRT
[a command that must not be interrupted]
スクリプト中いつでも信号を再度有効にする場合は、ダッシュ記号を使用してルールをリセットします。
trap - SIGINT SIGABRT
[a command that can be interrupted]