はじめに
システム管理者を目指す皆さん、ようこそ!あなたは活気あふれるテクノロジー企業に、ジュニアDevOpsエンジニアとして加わったばかりです。先輩エンジニアは заслуж? заслуж? заслуж? заслуж? deserved vacation のため休暇中で、重要な作業があなたのもとに舞い込んできました。メインのアプリケーションサーバーが大量のログファイルを生成しており、ディスク容量を急速に圧迫しています。あなたの使命は、引き受ける覚悟があるなら、スクリプト職人になることです。
これらのログファイルを管理する自動化シェルスクリプトを作成する必要があります。単にいくつかのコマンドを実行するだけではありません。堅牢で再利用可能なツールを構築することが目的です。まずは簡単なスクリプトから始め、変数、ユーザー入力、エラーチェック、ループといった機能を段階的に追加していきます。このチャレンジを終えるころには、ファイルのバックアップと管理ができるスクリプトを完成させ、チームに貢献し、問題を解決できる力を証明できるでしょう!
さあ、スクリプトを書き始めましょう!
- 一時的にそのチャレンジをスキップし、Linux学習パスの後続のガイド付き実験を進めてください。
- Labbyに相談するか、解答を確認してください。
シンプルなシェルスクリプトを書く
最初のタスクは、基礎を築くことです。優れたスクリプトも、最初は1行から始まります。スクリプトファイルを作成し、正しく動作することを確認する基本的なコマンドを追加しましょう。この初期ステップで環境が正しく設定され、より複雑なロジックを構築する準備が整っていることを確認できます。
タスク
~/projectディレクトリにlog_manager.shという名前の新しいシェルスクリプトファイルを作成します。- スクリプトの先頭に「シバン」行(
#!/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]」のようなメッセージを表示して設定内容を確認します。ここで[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パターンに一致する$LOG_DIR内のファイルを処理する必要があります。 - ループ内で
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エンジニアやシステム管理者としての成長における大きな一歩です。ここで身につけたスキルは、サーバーの管理、アプリケーションのデプロイ、データ処理など、さらに複雑な自動化スクリプトを書くための基礎になります。責任ある仕事を任され、実用的な解決策を完成させられることを証明しました。よくできました!



