DAY 10: スクリプトの職人

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

はじめに

システム管理者を目指す皆さん、ようこそ!あなたはジュニア DevOps エンジニアとして、活気あるテック企業に入社したばかりです。先輩社員は休暇中で、あなたのデスクには重要なタスクが届きました。メインのアプリケーションサーバーが大量のログファイルを生成しており、ディスク容量を急速に圧迫しています。あなたの任務は、スクリプトの職人(The Script Artisan)となり、この状況を解決することです。

これらのログファイルを管理するための自動化シェルスクリプトを作成する必要があります。これは単にいくつかのコマンドを実行するだけではなく、堅牢で再利用可能なツールを構築することを意味します。シンプルなスクリプトから始め、変数、ユーザー入力、エラーチェック、ループなどの機能を段階的に追加していきます。このチャレンジが終わる頃には、ファイルのバックアップと管理ができるスクリプトを完成させ、チームに貢献して窮地を救っていることでしょう!

さあ、スクリプト作成を始めましょう!

重要なお知らせ
これからのチャレンジは、Quick Start with Linux コースの範囲を超える可能性があります。
チャレンジ中に困難に直面した場合:
  1. 一時的にチャレンジをスキップし、Linux 学習パス の後続のガイド付き実験(Guided Labs)を進めてください。
  2. Labby に相談するか、解決策(Solution)を確認してください。

シンプルなシェルスクリプトの作成

最初のタスクは基礎を固めることです。優れたスクリプトはすべて、たった一行から始まります。スクリプトファイルを作成し、正しく動作することを確認するための基本的なコマンドを追加する必要があります。この初期ステップにより、セットアップが正しく、より複雑なロジックを構築する準備ができていることを確認します。

タスク

  • ~/project ディレクトリに log_manager.sh という名前の新しいシェルスクリプトファイルを作成します。
  • スクリプトの最上行に「シバン(shebang)」行(#!/bin/bash)を追加します。これは、どのインタプリタを使用するかをシステムに伝えます。
  • 画面に "Log Manager Initialized." というメッセージを表示するコマンドを追加します。
  • chmod +x コマンドを使用して、スクリプトを実行可能にします。

要件

  • スクリプト名は log_manager.sh であること。
  • スクリプトは ~/project ディレクトリに配置されていること。
  • 1 行目は #!/bin/bash であること。
  • 指定されたメッセージを表示するために echo コマンドを使用すること。
  • スクリプトに実行権限があること(chmod +x log_manager.sh を使用)。

スクリプトを作成して実行可能にした後、一連のプロセスは以下のようになります。

まず、スクリプトファイルが存在することを確認します:

ls ~/project/
log_manager.sh

スクリプトに実行権限を設定します:

chmod +x ~/project/log_manager.sh

スクリプトを実行します:

./log_manager.sh

スクリプトには以下のように表示されるはずです:

Log Manager Initialized.

スクリプトの内容が正しいか確認することもできます:

cat ~/project/log_manager.sh

ファイルには以下の内容が含まれている必要があります:

#!/bin/bash

echo "Log Manager Initialized."

ヒント

  • ファイルの作成と編集には、nano のようなコマンドラインテキストエディタを使用できます(例:nano log_manager.sh)。
  • echo コマンドは、テキストの一行を表示するために使用されます。
  • スクリプトを実行可能にするには chmod +x ファイル名 を使用します。+x はファイルの所有者に実行権限を追加します。

変数とユーザー入力の追加

内容が固定された(ハードコードされた)スクリプトは、あまり柔軟性がありません。スクリプトをより動的で再利用可能にするために、ここで変数を導入します。ログディレクトリ用の変数を定義し、バックアップアーカイブの名前をユーザーに問い合せるようにします。これにより、コード自体を変更することなく、さまざまな状況にスクリプトを適応させることができます。

タスク

  • log_manager.sh スクリプトを修正します。
  • LOG_DIR という名前の変数を定義し、パス /home/labex/project/app_logs を割り当てます。
  • ユーザーに入力を促すために、"Enter the backup filename: " と表示する行を追加します。
  • read コマンドを使用して、ユーザーの入力を BACKUP_FILENAME という新しい変数に格納します。
  • 設定を確認するための最後の echo コマンドを追加し、"Backing up logs to: [filename]"([filename] はユーザーが入力した値)のようなメッセージを表示します。

要件

  • スクリプトには、/home/labex/project/app_logs に設定された変数 LOG_DIR が含まれていること。
  • ユーザーから入力を取得するために read コマンドを使用すること。
  • ユーザー入力は BACKUP_FILENAME という名前の変数に保存されること。
  • 最終的な出力には $BACKUP_FILENAME 変数を使用すること。

修正したスクリプトを実行すると、ユーザー入力を求め、確認メッセージが表示されるはずです。対話の流れは以下のようになります:

./log_manager.sh
Log Manager Initialized.
Enter the backup filename: my_backup_2024.tar.gz
Backing up logs to: my_backup_2024.tar.gz

スクリプトは "Enter the backup filename:" のプロンプトで一時停止し、ユーザーがファイル名を入力して Enter キーを押すのを待ちます。入力後、入力されたファイル名を使用して確認メッセージが表示されます。

ヒント

  • 変数を定義するには、VARIABLE_NAME="value" という構文を使用します。= の前後にスペースを入れないでください。
  • 変数の値を使用するには、$MY_VARIABLE のように名前の前に $ を付けます。
  • read コマンドはスクリプトを一時停止させ、ユーザーが何かを入力して Enter を押すのを待ちます。

条件ロジックの実装

優れたスクリプトは問題を予測します。指定したログディレクトリが存在しない場合はどうなるでしょうか?スクリプトは失敗してしまいます。スクリプトをより堅牢にするために、条件ロジックを追加する必要があります。if 文を使用して、操作を試みる前にログディレクトリが存在するかどうかを確認します。

タスク

  • log_manager.sh スクリプトを修正します。
  • $LOG_DIR 変数で指定されたディレクトリが存在するかどうかを確認する if 文を追加します。
  • ディレクトリが存在する場合、スクリプトは以前と同様に続行します(ファイル名の入力プロンプトなど)。
  • ディレクトリが存在しない場合、スクリプトはエラーメッセージ "Error: Log directory not found." を表示し、ゼロ以外のステータスコードで直ちに終了します。

要件

  • スクリプトで if 文を使用すること。
  • 条件式には、ディレクトリの存在を確認する -d テスト演算子を使用すること。
  • ディレクトリが存在しない場合、指定されたエラーメッセージを echo すること。
  • ディレクトリが存在しない場合、exit 1 を使用してスクリプトを終了させること。

ログディレクトリが存在する場合、スクリプトは正常に動作します:

./log_manager.sh
Log Manager Initialized.
Log directory found. Proceeding...
Enter the backup filename: test_backup.tar.gz
Backing up logs to: test_backup.tar.gz

ログディレクトリが存在しない場合、スクリプトはエラーを表示して終了します:

./log_manager.sh
Log Manager Initialized.
Error: Log directory not found.

この場合、スクリプトはエラーメッセージを表示した直後に終了し、ユーザー入力のプロンプトやバックアップ操作には進みません。

ヒント

  • 基本的な if 文の構文は if [ condition ]; then ... else ... fi です。
  • テスト式 [ -d "$DIRECTORY_PATH" ] は、$DIRECTORY_PATH が存在し、かつディレクトリである場合に真を返します。
  • exit 1 は、スクリプトがエラーで終了したことを示す標準的な方法です。

ループによるファイル操作

いよいよ自動化の核心です!ログディレクトリ内のファイルを処理する必要があります。for ループを使用して、app_logs ディレクトリ内の .log で終わるすべてのファイルを反復処理します。このチャレンジでは、それらを新しいバックアップディレクトリにコピーするだけの処理を行います。

タスク

  • まず、ログファイルがコピーされる場所として、~/project 内に backups という名前のディレクトリを作成します。
  • log_manager.sh スクリプトを修正します。
  • if ブロック内(ディレクトリの存在が確認された場所)に for ループを追加します。
  • ループは、$LOG_DIR ディレクトリ内の .log で終わるすべてのファイルを対象にします。
  • ループ内で cp コマンドを使用して、各ログファイルを ~/project/backups ディレクトリにコピーします。
  • ファイルがコピーされるたびに、"Copied [filename]" のようなメッセージを表示します。

要件

  • 最初にコマンドラインから ~/project/backups ディレクトリを作成すること。
  • スクリプトで for ループを使用すること。
  • ループは $LOG_DIR 内の *.log パターンに一致するファイルを反復処理すること。
  • ループ内で cp コマンドを使用してファイルを ~/project/backups にコピーすること。
  • 各ファイルがコピーされる際に、そのファイル名を echo で報告すること。

このステップを完了した後、バックアップファイル名を指定してスクリプトを実行すると、すべてのログファイルが処理され、以下のような出力が表示されるはずです:

./log_manager.sh
Log Manager Initialized.
Log directory found. Proceeding...
Enter the backup filename: full_backup.tar.gz
Backing up logs to: full_backup.tar.gz
Copied /home/labex/project/app_logs/access.log
Copied /home/labex/project/app_logs/debug.log
Copied /home/labex/project/app_logs/error.log
Backup complete.

スクリプトはディレクトリ内の各 .log ファイルをループし、各ファイルに対して "Copied" メッセージを表示します。正確なファイル名は、app_logs ディレクトリに存在するログファイルによって異なります。

スクリプト完了後、backups ディレクトリを確認してファイルがコピーされたことを検証できます:

ls ~/project/backups/
access.log  debug.log  error.log

ヒント

  • ディレクトリの作成には mkdir コマンドを使用します。
  • ファイルを対象とした for ループは、for file in /path/to/*.log; do ... done のように記述できます。
  • cp コマンドの構文は cp <コピー元> <コピー先> です。
  • ループ変数(例:file)には、各反復でファイルのフルパスが保持されます。

まとめ

おめでとうございます、スクリプトの職人さん!ゼロから完全で機能的なシェルスクリプトを構築することに成功しました。ログファイルの管理という現実世界の問題に取り組み、自動化の力で解決しました。

このチャレンジでは、シェルスクリプトのいくつかの基本概念を習得しました:

  • シバンを使用してスクリプトを作成し、構造化する。
  • 変数を使用してスクリプトを動的にする。
  • read を使用してユーザー入力を取得する。
  • if 文を使用して堅牢なエラーチェックを実装する。
  • for ループを使用して反復的なタスクを自動化する。
  • ファイル権限を管理し、スクリプトを実行する。

作成したスクリプトは、ログディレクトリの存在を自動的に確認し、すべてのログファイルを処理して、バックアップ場所にコピーできるようになりました。これは、DevOps エンジニアやシステム管理者としての道のりにおける大きな一歩です。ここで練習したスキルは、サーバーの管理、アプリケーションのデプロイ、データの処理を行う、より複雑な自動化スクリプトを作成するための基礎となります。あなたは責任を果たし、機能するソリューションを提供できることを証明しました。素晴らしい成果です!

✨ 解答を確認して練習✨ 解答を確認して練習✨ 解答を確認して練習✨ 解答を確認して練習