はじめに
システム管理者を目指す皆さん、ようこそ!あなたはジュニア DevOps エンジニアとして、活気あるテック企業に入社したばかりです。先輩社員は休暇中で、あなたのデスクには重要なタスクが届きました。メインのアプリケーションサーバーが大量のログファイルを生成しており、ディスク容量を急速に圧迫しています。あなたの任務は、スクリプトの職人(The Script Artisan)となり、この状況を解決することです。
これらのログファイルを管理するための自動化シェルスクリプトを作成する必要があります。これは単にいくつかのコマンドを実行するだけではなく、堅牢で再利用可能なツールを構築することを意味します。シンプルなスクリプトから始め、変数、ユーザー入力、エラーチェック、ループなどの機能を段階的に追加していきます。このチャレンジが終わる頃には、ファイルのバックアップと管理ができるスクリプトを完成させ、チームに貢献して窮地を救っていることでしょう!
さあ、スクリプト作成を始めましょう!
- 一時的にチャレンジをスキップし、Linux 学習パス の後続のガイド付き実験(Guided Labs)を進めてください。
- 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 エンジニアやシステム管理者としての道のりにおける大きな一歩です。ここで練習したスキルは、サーバーの管理、アプリケーションのデプロイ、データの処理を行う、より複雑な自動化スクリプトを作成するための基礎となります。あなたは責任を果たし、機能するソリューションを提供できることを証明しました。素晴らしい成果です!



