Bash の trap コマンド

LinuxLinuxBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Bash スクリプトにおける trap コマンドを調べます。trap コマンドは、スクリプト内でシグナル、割り込み、ユーザー入力をキャッチして処理するための強力なツールです。trap を使用することで、特定のシグナルを受信したときに実行する特定のアクションを定義でき、予測できない動作を管理し、さまざまなシナリオを円滑に処理することができます。この実験は初心者向けに設計されており、trap コマンドを効果的に使用するプロセスを案内します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) shell(("Shell")) -.-> shell/ControlFlowGroup(["Control Flow"]) shell(("Shell")) -.-> shell/BasicSyntaxandStructureGroup(["Basic Syntax and Structure"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) shell(("Shell")) -.-> shell/FunctionsandScopeGroup(["Functions and Scope"]) shell(("Shell")) -.-> shell/SystemInteractionandConfigurationGroup(["System Interaction and Configuration"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") shell/BasicSyntaxandStructureGroup -.-> shell/shebang("Shebang") shell/BasicSyntaxandStructureGroup -.-> shell/comments("Comments") linux/BasicFileOperationsGroup -.-> linux/touch("File Creating/Updating") linux/BasicFileOperationsGroup -.-> linux/chmod("Permission Modifying") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") shell/ControlFlowGroup -.-> shell/while_loops("While Loops") shell/FunctionsandScopeGroup -.-> shell/func_def("Function Definition") shell/SystemInteractionandConfigurationGroup -.-> shell/trap_statements("Trap Statements") subgraph Lab Skills linux/echo -.-> lab-388820{{"Bash の trap コマンド"}} shell/shebang -.-> lab-388820{{"Bash の trap コマンド"}} shell/comments -.-> lab-388820{{"Bash の trap コマンド"}} linux/touch -.-> lab-388820{{"Bash の trap コマンド"}} linux/chmod -.-> lab-388820{{"Bash の trap コマンド"}} linux/cd -.-> lab-388820{{"Bash の trap コマンド"}} shell/while_loops -.-> lab-388820{{"Bash の trap コマンド"}} shell/func_def -.-> lab-388820{{"Bash の trap コマンド"}} shell/trap_statements -.-> lab-388820{{"Bash の trap コマンド"}} end

Bash スクリプトを作成する

trap コマンドを実装する新しい Bash スクリプト ファイルを作成して始めましょう。

  1. WebIDE でターミナルを開きます。プロンプトの末尾に $ 記号が表示されるはずです。

  2. プロジェクト ディレクトリに移動します。

    cd ~/project

    このコマンドは現在の作業ディレクトリを /home/labex/project に変更します。

  3. trap_example.sh という名前の新しいファイルを作成します。

    touch trap_example.sh

    touch コマンドは、ファイルが存在しない場合は空のファイルを作成し、存在する場合は変更日時を更新します。

  4. WebIDE エディタで trap_example.sh ファイルを開きます。WebIDE の左側のファイル エクスプローラーでファイル名をクリックすることで行えます。

基本的な trap コマンドを実装する

次に、特定のシグナルをキャッチして円滑に終了するための基本的な trap コマンドをスクリプトに実装しましょう。

  1. trap_example.sh ファイルに以下の内容を追加します。

    #!/bin/bash
    
    cleanup_and_exit() {
      echo -e "\nSignal received! Cleaning up and exiting..."
      exit 0
    }
    
    trap cleanup_and_exit SIGINT SIGTERM
    
    echo "This script will run until you press Ctrl+C."
    echo "Press Ctrl+C to see the trap in action and exit gracefully."
    
    count=1
    while true; do
      echo "Script is running... (iteration $count)"
      sleep 1
      ((count++))
    done

    このスクリプトを分解してみましょう。

    • 最初の行 #!/bin/bash はシェバンと呼ばれます。これは、このスクリプトが Bash シェルによって実行されることをシステムに伝えます。
    • メッセージを表示してスクリプトを終了する cleanup_and_exit 関数を定義します。
    • trap コマンドは、SIGINT(割り込み)または SIGTERM(終了)シグナルをキャッチしたときに cleanup_and_exit を呼び出すように設定されています。SIGINT は通常、Ctrl+C を押すと送信され、SIGTERM はプロセスが円滑に終了するように要求されたときによく使用されます。
    • echo コマンドはユーザーに対する指示を表示します。
    • while ループは無限に実行され、メッセージを表示してカウンターを毎秒インクリメントします。
  2. 内容を追加した後、ファイルを保存します。

スクリプトを実行可能にして実行する

スクリプトを実行する前に、実行可能にする必要があります。これは、このファイルがプログラムとして実行されることが許可されることをシステムに伝えます。

  1. ターミナルで、スクリプトを実行可能にします。

    chmod +x ~/project/trap_example.sh

    chmod コマンドはファイルのパーミッションを変更します。+x オプションは実行権限を追加します。

  2. スクリプトを実行します。

    ~/project/trap_example.sh

    このコマンドは Bash に対して、私たちのスクリプトを実行するように指示します。

  3. スクリプトが実行を開始します。画面に指示が表示されるはずです。数秒間実行させます。

  4. 次に、Ctrl+C を押して割り込みます。スクリプトが終了する前に、「Signal received!」というメッセージが表示されるはずです。これが私たちのトラップの動作です!

関数を使用するようにトラップを変更する

単純な関数を使用する代わりに、trap コマンドを使ってより複雑な関数を使うようにスクリプトを変更しましょう。これにより、シグナルを受信したときにより詳細なアクションを実行できます。

  1. WebIDE エディタで trap_example.sh ファイルを開きます。

  2. ファイルの内容を以下のものに置き換えます。

    #!/bin/bash
    
    cleanup_and_exit() {
      echo -e "\nSignal received! Cleaning up..."
      echo "Performing cleanup tasks..."
      ## ここに必要なクリーンアップ コードを追加してください
      echo "Cleanup completed."
      echo "Exiting script gracefully."
      exit 0
    }
    
    trap cleanup_and_exit SIGINT SIGTERM
    
    echo "This script will run until you press Ctrl+C."
    echo "Press Ctrl+C to see the trap function in action and exit gracefully."
    
    count=1
    while true; do
      echo "Script is running... (iteration $count)"
      sleep 1
      ((count++))
    done

    変更点を見てみましょう。

    • cleanup_and_exit 関数を拡張して、より詳細なメッセージとクリーンアップ タスク用のプレースホルダーを追加しました。
    • この関数は、ファイル ハンドルのクローズ、一時ファイルの削除、またはその他のリソースの解放などのタスクを含む、より現実的なクリーンアップ プロセスをシミュレートしています。
    • メイン ループを更新して反復回数を表示するようにし、スクリプトがアクティブに実行されていることを明確にしました。
  3. これらの変更を加えた後、ファイルを保存します。

  4. スクリプトを再度実行し、Ctrl+C を押してテストします。

    ~/project/trap_example.sh

    スクリプトを中断すると、cleanup_and_exit 関数からの新しいメッセージが表示され、円滑な終了が示されます。

まとめ

この実験では、Bash スクリプトで trap コマンドをどのように使用するかを学びました。特定のシグナルをキャッチし、それらのシグナルが受信されたときに実行するアクションを定義するスクリプトを作成しました。インライン コマンドや関数を使用するなど、trap コマンドのさまざまな使い方を検討しました。

trap コマンドは、Bash スクリプトで割り込みを処理してクリーンアップ アクションを実行するための強力なツールです。予期しない終了やユーザーの割り込みを円滑に処理することで、より堅牢でユーザーにやさしいコマンドライン アプリケーションを作成できます。

信号を処理する能力は、多くのスクリプト シナリオで重要です。たとえば、一時ファイルの適切なクリーンアップ、ネットワーク接続の切断、またはスクリプトが予期せず終了する前の状態の保存などが挙げられます。