Bash の trap コマンド

LinuxBeginner
オンラインで実践に進む

はじめに

この実験では、Bash スクリプトにおける trap コマンドについて詳しく見ていきます。trap コマンドは、スクリプト実行中のシグナル、割り込み、ユーザー入力を捕捉して処理できる強力なツールです。trap を使用することで、特定のシグナルを受信した際に実行すべきアクションを定義でき、予期しない動作を制御したり、さまざまな状況下でスクリプトを安全に終了させたりすることが可能になります。この実験は初心者向けに設計されており、trap コマンドを効果的に使いこなす手順をガイドします。

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 はシバン(shebang)と呼ばれます。これは、このスクリプトを Bash シェルで実行するようにシステムに指示するものです。
    • cleanup_and_exit という関数を定義しました。これはメッセージを表示してスクリプトを終了させる役割を持ちます。
    • trap コマンドは、SIGINT(割り込み)または SIGTERM(終了)シグナルを捕捉したときに cleanup_and_exit 関数を呼び出すように設定されています。SIGINT は通常 Ctrl+C を押したときに送信され、SIGTERM はプロセスを正常に終了させる際によく使用されます。
    • echo コマンドでユーザーへの指示を表示します。
    • while ループは無限に実行され、1 秒ごとにメッセージを表示してカウンタを増やします。
  2. 内容を追加したらファイルを保存します。

スクリプトの実行権限付与と実行

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

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

    chmod +x ~/project/trap_example.sh

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

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

    ~/project/trap_example.sh

    このコマンドにより、Bash がスクリプトを実行します。

  3. スクリプトが動き始めます。画面に指示が表示されるので、数秒間そのままにしておきます。

  4. ここで、Ctrl+C を押してスクリプトを中断してください。スクリプトが終了する前に "Signal received!" というメッセージが表示されるはずです。これが trap の動作です。

関数を使用した trap の修正

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

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

  2. ファイルの内容を以下のように書き換えます。

    #!/bin/bash
    
    cleanup_and_exit() {
      echo -e "\nSignal received! Cleaning up..."
      echo "Performing cleanup tasks..."
      ## Add any necessary cleanup code here
      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 スクリプトにおいて割り込みを処理し、クリーンアップ作業を行うための非常に強力なツールです。予期しない終了やユーザーによる中断を適切に処理することで、より堅牢でユーザーフレンドリーなコマンドラインアプリケーションを作成できるようになります。

シグナルを処理する能力は、一時ファイルの確実な削除、ネットワーク接続の切断、あるいはスクリプトが予期せず終了する前の状態保存など、多くのスクリプト作成シナリオにおいて極めて重要であることを覚えておいてください。