はじめに
システム管理者を目指す皆さん、ようこそ!あなたは今、活気あるテック企業にジュニアDevOpsエンジニアとして加わりました。先輩社員が休暇中の今、重要なタスクがあなたのデスクに舞い込んできました。メインのアプリケーションサーバーが大量のログファイルを生成しており、ディスク容量を急速に圧迫しています。このミッションを引き受けるなら、あなたは「スクリプト職人」となる必要があります。
あなたは、これらのログファイルを管理するための自動化シェルスクリプトを作成しなければなりません。これは単にいくつかのコマンドを実行するだけではなく、堅牢で再利用可能なツールを構築するということです。まずはシンプルなスクリプトから始め、変数、ユーザー入力、エラーチェック、ループといった機能を段階的に追加していきます。このチャレンジを終える頃には、ファイルのバックアップと管理ができるスクリプトが完成し、チームにとっての価値を証明し、窮地を救うことができるでしょう!
それでは、スクリプト作成を始めましょう!
- 一時的にそのチャレンジをスキップし、Linux学習パスの後のガイド付きラボに進んでください。
- Labbyに相談するか、解答を確認してください。
シンプルなシェルスクリプトの作成
最初のタスクは、基礎を固めることです。どんな素晴らしいスクリプトも、たった1行から始まります。スクリプトファイルを作成し、基本的なコマンドを追加して、正しく動作することを確認しましょう。この最初のステップは、セットアップが正しく行われており、より複雑なロジックを構築する準備ができていることを確認するためのものです。
タスク
~/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 filenameを使用してスクリプトを実行可能にします。+xはファイルの所有者に実行権限を追加します。
変数とユーザー入力の追加
ハードコードされたスクリプトは柔軟性に欠けます。スクリプトをより動的で再利用可能なものにするために、変数を導入します。ログディレクトリ用の変数を定義し、ユーザーにバックアップ実行ラベルの入力を求めます。これにより、コード自体を変更することなく、さまざまな状況に適応できるようになります。
タスク
log_manager.shスクリプトを修正します。LOG_DIRという変数を定義し、パス/home/labex/project/app_logsを割り当てます。- "Enter the backup filename: " と表示し、ユーザーに入力を促す行を追加します。
readコマンドを使用して、ユーザーの入力をBACKUP_FILENAMEという新しい変数に格納します。- 最後に
echoコマンドを追加し、設定を確認します。ユーザーが入力した値を使用して "Backing up logs to: [filename]" のようなメッセージを表示してください。
要件
- スクリプトには
/home/labex/project/app_logsに設定された変数LOG_DIRが含まれていること。 - スクリプトはユーザーからの入力を取得するために
readコマンドを使用すること。 - ユーザー入力は
BACKUP_FILENAMEという変数に格納されること。 - 最終的な出力には
$BACKUP_FILENAME変数を使用すること。
例
修正したスクリプトを実行すると、ユーザー入力を求め、確認メッセージが表示されるはずです。対話は以下のようになります:
./log_manager.sh
Log Manager Initialized.
Enter the backup filename: daily_backup
Backing up logs to: daily_backup
スクリプトは "Enter the backup filename:" プロンプトで一時停止し、ユーザーが名前を入力して Enter キーを押すのを待ちます。ユーザーが入力すると、入力された値を使用して確認メッセージが表示されます。このチャレンジでは、その値は出力に表示される実行ラベルであり、実際のバックアップ操作はステップ4で .log ファイルを ~/project/backups にコピーすることで実装されます。
ヒント
- 変数を定義するには、
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 で終わるすべてのファイルを反復処理します。このチャレンジでは、それらを新しいバックアップディレクトリにコピーするだけです。BACKUP_FILENAME の入力は出力に表示される実行ラベルのままであり、スクリプトによって作成されるアーカイブファイルではありません。
タスク
- まず、
~/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: daily_backup
Backing up logs to: daily_backup
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 <source> <destination>です。- ループ変数(例:
file)には、各反復でファイルのフルパスが保持されます。
まとめ
おめでとうございます、スクリプト職人さん!あなたはゼロから完全で機能的なシェルスクリプトを構築することに成功しました。ログファイルの管理という現実的な問題に取り組み、自動化の力で解決しました。
このチャレンジを通じて、シェルスクリプトのいくつかの基本的な概念を習得しました:
- シバンを使用してスクリプトを作成し、構造化する。
- 変数を使用してスクリプトを動的にする。
readを使用してユーザー入力を取得する。if文を使用して堅牢なエラーチェックを実装する。forループを使用して反復タスクを自動化する。- ファイル権限を管理し、スクリプトを実行する。
あなたのスクリプトは、ログディレクトリの存在を自動的に確認し、すべてのログファイルを処理して、バックアップ場所にコピーできるようになりました。これは、DevOpsエンジニアやシステム管理者としてのあなたの旅における大きな一歩です。ここで練習したスキルは、サーバーの管理、アプリケーションのデプロイ、データの処理を行う、より複雑な自動化スクリプトを書くための基礎となります。あなたは責任を果たし、機能するソリューションを提供できることを証明しました。よく頑張りました!



