GNU/Linux >> Linux の 問題 >  >> Linux

Bashトラップコマンドの説明

はじめに

シェルスクリプトは、実行中に問題が発生し、スクリプトを予期せず中断するエラー信号が発生する可能性があります。

エラーは、スクリプトデザインの誤り、ユーザーアクション、またはシステム障害が原因で発生します。スクリプトが失敗すると、一時ファイルが残り、ユーザーがスクリプトを再起動したときに問題が発生する可能性があります。

このチュートリアルでは、 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]

Linux
  1. Linuxの履歴コマンドを詳細に説明

  2. bash エクスポート コマンド

  3. jenkins パイプラインで bash コマンドを実行する

  1. Bash数学演算(Bash算術)の説明

  2. Bash待機コマンド

  3. Bash読み取りコマンド

  1. バッシュヒアドキュメント

  2. Bashソースコマンド

  3. Linuxの履歴コマンド(Bashの履歴)