BASHプログラミング
 Computer >> コンピューター >  >> プログラミング >> BASHプログラミング

スクリプトでのBashトラップの使用

シェルスクリプトがいつ開始するかを検出するのは簡単ですが、いつ停止するかを知るのは必ずしも簡単ではありません。スクリプトは、作成者が意図したとおりに正常に終了する可能性がありますが、予期しない致命的なエラーが原因で失敗する可能性もあります。スクリプトが失敗したときに進行中だったものの残骸を保持することが有益な場合もあれば、不便な場合もあります。いずれにせよ、スクリプトの終わりを検出し、事前に計算された方法でそれに反応することが、Bashのtrapの理由です。 ディレクティブが存在します。

障害への対応

これは、スクリプト内の1つの失敗が将来の失敗につながる可能性がある方法の例です。 /tmpに一時ディレクトリを作成するプログラムを作成したとします。 ファイルを別の形式でバンドルする前に、ファイルをアーカイブ解除して処理できるようにします。

#!/usr/bin/env bash
CWD=`pwd`
TMP=${TMP:-/tmp/tmpdir}

## create tmp dir
mkdir "${TMP}"

## extract files to tmp
tar xf "${1}" --directory "${TMP}"

## move to tmpdir and run commands
pushd "${TMP}"
for IMG in *.jpg; do
  mogrify -verbose -flip -flop "${IMG}"
done
tar --create --file "${1%.*}".tar *.jpg

## move back to origin
popd

## bundle with bzip2
bzip2 --compress "${TMP}"/"${1%.*}".tar \
      --stdout > "${1%.*}".tbz

## clean up
/usr/bin/rm -r /tmp/tmpdir

ほとんどの場合、スクリプトは期待どおりに機能します。ただし、予期されたJPEGファイルではなくPNGファイルで満たされたアーカイブで誤って実行すると、途中で失敗します。ある失敗が別の失敗につながり、最終的に、スクリプトは一時ディレクトリを削除する最終的な指示に到達せずに終了します。ディレクトリを手動で削除する限り、すぐに回復できますが、それを実行する必要がない場合は、次にスクリプトを実行するときに、予測できない残りのファイルでいっぱいの既存の一時ディレクトリを処理する必要があります。

これに対抗する1つの方法は、スクリプトの先頭に予防的削除を追加することにより、ロジックを逆にしてダブルアップすることです。有効ではありますが、それは構造ではなくブルートフォースに依存しています。より洗練されたソリューションはtrap

トラップで信号をキャッチする

trap キーワードはシグナルをキャッチします これは実行中に発生する可能性があります。 killを使用したことがある場合は、これらのシグナルの1つを使用したことがあります。 またはkillall SIGTERMを呼び出すコマンド デフォルトでは。シェルが応答するシグナルは他にもたくさんあり、それらのほとんどはtrap -l で確認できます。 (「リスト」のように):

$ trap --list
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

これらの信号はいずれも、trapで予測される可能性があります 。これらに加えて、trap 認識します:

  • EXIT :シェルプロセス自体が終了したときに発生します
  • ERR :コマンド( tar など)が発生したときに発生します またはmkdir )または組み込みコマンド( pushd など) またはcd )ゼロ以外のステータスで完了します
  • DEBUG :デバッグモードを表すブール値

Bashにトラップを設定するには、trapを使用します 実行したいコマンドのリスト、それをトリガーするシグナルのリストが続きます。

たとえば、このトラップはSIGINTを検出します 、ユーザーが Ctrl + Cを押したときに送信される信号 プロセスの実行中:

trap "{ echo 'Terminated with Ctrl+C'; }" SIGINT

一時ディレクトリの問題があるサンプルスクリプトは、SIGINTを検出するトラップで修正できます。 、エラー、および正常終了:

#!/usr/bin/env bash
CWD=`pwd`
TMP=${TMP:-/tmp/tmpdir}

trap \
 "{ /usr/bin/rm -r "${TMP}" ; exit 255; }" \
 SIGINT SIGTERM ERR EXIT

## create tmp dir
mkdir "${TMP}"
tar xf "${1}" --directory "${TMP}"

## move to tmp and run commands
pushd "${TMP}"
for IMG in *.jpg; do
  mogrify -verbose -flip -flop "${IMG}"
done
tar --create --file "${1%.*}".tar *.jpg

## move back to origin
popd

## zip tar
bzip2 --compress $TMP/"${1%.*}".tar \
      --stdout > "${1%.*}".tbz

複雑なアクションの場合は、trapを簡略化できます Bash関数を使用したステートメント。

Bashのトラップ

トラップは、スクリプトが正常に実行されたかどうかに関係なく、スクリプトが正常に終了するようにするために役立ちます。自動化されたガベージコレクションに完全に依存することは決して安全ではないので、これは一般的に入るのに良い習慣です。スクリプトでそれらを使用してみて、何ができるかを確認してください!


  1. Bash-it –スクリプトとエイリアスを制御するためのBashフレームワーク

    Bash-it は、 Bash 3.2+用のコミュニティBashコマンドとスクリプトのバンドルです。 、オートコンプリート、テーマ、エイリアス、カスタム関数などが付属しています。日常業務用のシェルスクリプトとカスタムコマンドを開発、保守、使用するための便利なフレームワークを提供します。 日常的にBashシェルを使用していて、すべてのスクリプト、エイリアス、関数を追跡する簡単な方法を探している場合は、 Bash-it あなたのためです! 〜/ binの汚染をやめましょう ディレクトリと.bashrc ファイル、フォーク/クローンBash-それをハッキングし始めます。 LinuxにBash-

  2. PC でレジストリ クリーナーを使用する利点

    レジストリ クリーナー 本当ですか レジストリ クリーナーが必要ですか? これは、この Web サイトで最もよく聞かれる質問であり、質問者によってさまざまな答えが得られる質問です。私たちはこれらのツールを長い間使用してきましたが、これらのツールが PC で何ができるかを正確に知ることができました。それが、今日この記事で説明したいことです。 レジストリ クリーナーとは レジストリ クリーナーは、「レジストリ」と呼ばれる Windows の一部をスキャンするソフトウェア ツールです。これは、PC の設定、オプション、および詳細を保存するデータベースです。コンピュータの「メモリ」のようなものとして