0Pricing
DevOps Bootcamp · レッスン

高度なスクリプティングプロジェクト

コマンドラインツールから高度なBashスクリプト技法まで、学んだ概念をすべて組み合わせた総合プロジェクトに取り組みます。

「高度なスクリプティングプロジェクト」はCoddyKit上の無料DevOps Bootcampレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDevOps Bootcamp学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 DevOps Bootcampコースには全4レッスンが含まれています。

プロジェクト開始:課題

最終プロジェクトへようこそ。このコースでは、Linuxの強力なコマンドとBashスクリプトのテクニックを数多く学びました。ここで、それらをすべて組み合わせます。

このレッスンでは、実用的で高度なBashスクリプトをゼロから作成します。これまでに学んだことを、1つの機能的なソリューションに統合する課題です。

プロジェクトの目標を定義する

目標は、ファイル監視およびアーカイブスクリプトを作成することです。ログファイルを生成するサーバーがあり、手作業なしで定期的に処理する必要がある状況を想像してください。

このスクリプトでは、次の処理を行います。

  • 特定のディレクトリを継続的に監視し、新しいテキストファイルを検出する。
  • 新しいファイルを1つずつ処理する(例:行数を数える)。
  • 処理済みのファイルをアーカイブディレクトリに移動する。
  • タイムスタンプやエラーを含むすべてのアクティビティをログに記録する。

スクリプトの基礎:Shebangと変数

よいスクリプトは、明確な基盤から始まります。まずshebangを定義し、主要な変数を設定します。これらの変数によって、スクリプトを柔軟で設定しやすいものにできます。

監視対象ディレクトリ、アーカイブディレクトリ、ログファイルのパスを定義します。

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

ディレクトリの存在を確認する

スクリプトで監視やアーカイブを行う前に、必要なディレクトリが存在することを確認する必要があります。ここではmkdir -pが重要です。ディレクトリがまだ存在しない場合だけ作成し、すでに存在していてもエラーになりません。

また、ディレクトリの作成に失敗した場合に正常に終了できるよう、基本的なエラー処理も追加します。

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

# Ensure monitoring and archive directories exist
mkdir -p "$MONITOR_DIR" || { echo "$(date): ERROR: Cannot create $MONITOR_DIR. Exiting." >> "$LOG_FILE"; exit 1; }
mkdir -p "$ARCHIVE_DIR" || { echo "$(date): ERROR: Cannot create $ARCHIVE_DIR. Exiting." >> "$LOG_FILE"; exit 1; }

echo "$(date): Directories checked/created." >> "$LOG_FILE"

監視ループ

新しいファイルを監視するには、スクリプトを継続的に実行する必要があります。この処理にはwhile trueループが適しています。ループ内でsleepを使ってチェックの間に数秒間の待機を入れ、リソースを過剰に消費しないようにします。

また、アクティビティを追跡できるよう、チェックのたびにログを記録します。

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

# Ensure monitoring and archive directories exist
mkdir -p "$MONITOR_DIR" || { echo "$(date): ERROR: Cannot create $MONITOR_DIR. Exiting." >> "$LOG_FILE"; exit 1; }
mkdir -p "$ARCHIVE_DIR" || { echo "$(date): ERROR: Cannot create $ARCHIVE_DIR. Exiting." >> "$LOG_FILE"; exit 1; }

echo "$(date): Directories checked/created." >> "$LOG_FILE"

# --- Main Monitoring Loop ---
while true; do
  echo "$(date): Checking for new files in $MONITOR_DIR..." >> "$LOG_FILE"
  # File processing will go here
  sleep 5 # Check every 5 seconds
done

ファイルの検索と処理

ループ内で、新しいテキストファイルを検索する必要があります。この処理にはfindコマンドが適しており、forループと組み合わせて見つかった各ファイルを処理します。処理のステップとして、wc -lを使って各ファイルの行数を数えます。

これは、スクリプト内でコマンドラインツールを組み合わせる方法を示しています。

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

# Ensure monitoring and archive directories exist
mkdir -p "$MONITOR_DIR" || { echo "$(date): ERROR: Cannot create $MONITOR_DIR. Exiting." >> "$LOG_FILE"; exit 1; }
mkdir -p "$ARCHIVE_DIR" || { echo "$(date): ERROR: Cannot create $ARCHIVE_DIR. Exiting." >> "$LOG_FILE"; exit 1; }

echo "$(date): Directories checked/created." >> "$LOG_FILE"

# --- Main Monitoring Loop ---
while true; do
  echo "$(date): Checking for new files in $MONITOR_DIR..." >> "$LOG_FILE"
  # Find new .txt files and process them
  for file in $(find "$MONITOR_DIR" -maxdepth 1 -type f -name "*.txt"); do
    if [ -f "$file" ]; then # Double-check if it's a regular file
      LINE_COUNT=$(wc -l < "$file")
      echo "$(date): Found '$file'. Lines: $LINE_COUNT." >> "$LOG_FILE"
      # Archiving will go here
    fi
  done
  sleep 5 # Check every 5 seconds
done

処理済みファイルのアーカイブ

ファイルの処理が終わったら、アーカイブディレクトリに移動する必要があります。これにはmvコマンドを使います。また、if文を追加してmvの終了ステータスを確認し、移動が成功したことを検証するとともに、失敗した場合はログに記録します。

これにより、スクリプトの堅牢性が高まります。

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

# Ensure monitoring and archive directories exist
mkdir -p "$MONITOR_DIR" || { echo "$(date): ERROR: Cannot create $MONITOR_DIR. Exiting." >> "$LOG_FILE"; exit 1; }
mkdir -p "$ARCHIVE_DIR" || { echo "$(date): ERROR: Cannot create $ARCHIVE_DIR. Exiting." >> "$LOG_FILE"; exit 1; }

echo "$(date): Directories checked/created." >> "$LOG_FILE"

# --- Main Monitoring Loop ---
while true; do
  echo "$(date): Checking for new files in $MONITOR_DIR..." >> "$LOG_FILE"
  for file in $(find "$MONITOR_DIR" -maxdepth 1 -type f -name "*.txt"); do
    if [ -f "$file" ]; then
      LINE_COUNT=$(wc -l < "$file")
      echo "$(date): Found '$file'. Lines: $LINE_COUNT." >> "$LOG_FILE"
      
      mv "$file" "$ARCHIVE_DIR/"
      if [ $? -eq 0 ]; then
        echo "$(date): Moved '$file' to '$ARCHIVE_DIR'." >> "$LOG_FILE"
      else
        echo "$(date): ERROR: Failed to move '$file' to '$ARCHIVE_DIR'." >> "$LOG_FILE"
      fi
    fi
  done
  sleep 5
done

trapによる正常な終了処理の追加

長時間実行されるスクリプトには、正常に停止する仕組みが必要です。trapコマンドを使うと、SIGINT(Ctrl+Cによって発生)などのシグナルを捕捉し、終了前にクリーンアップ関数を実行できます。これにより、スクリプトの終了をログに記録できます。

これは、本番環境で使えるスクリプトにするための重要なステップです。

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# --- Functions ---
cleanup() {
  echo "$(date): Script received stop signal. Exiting gracefully." >> "$LOG_FILE"
  exit 0 # Exit with success status
}

# --- Trap Signals ---
# Trap SIGINT (Ctrl+C) and call the cleanup function
trap cleanup SIGINT

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

# Ensure monitoring and archive directories exist
mkdir -p "$MONITOR_DIR" || { echo "$(date): ERROR: Cannot create $MONITOR_DIR. Exiting." >> "$LOG_FILE"; exit 1; }
mkdir -p "$ARCHIVE_DIR" || { echo "$(date): ERROR: Cannot create $ARCHIVE_DIR. Exiting." >> "$LOG_FILE"; exit 1; }

echo "$(date): Directories checked/created." >> "$LOG_FILE"

# --- Main Monitoring Loop ---
while true; do
  echo "$(date): Checking for new files in $MONITOR_DIR..." >> "$LOG_FILE"
  for file in $(find "$MONITOR_DIR" -maxdepth 1 -type f -name "*.txt"); do
    if [ -f "$file" ]; then
      LINE_COUNT=$(wc -l < "$file")
      echo "$(date): Found '$file'. Lines: $LINE_COUNT." >> "$LOG_FILE"
      
      mv "$file" "$ARCHIVE_DIR/"
      if [ $? -eq 0 ]; then
        echo "$(date): Moved '$file' to '$ARCHIVE_DIR'." >> "$LOG_FILE"
      else
        echo "$(date): ERROR: Failed to move '$file' to '$ARCHIVE_DIR'." >> "$LOG_FILE"
      fi
    fi
  done
  sleep 5
done

高度なスクリプトのテスト

これでスクリプトが完成したので、テストしてみましょう。通常はバックグラウンドで実行し(例:./monitor.sh &)、$MONITOR_DIRにテストファイルを作成して、$LOG_FILEと$ARCHIVE_DIRを確認します。

次に、監視対象のテストファイルを簡単に作成できる小さなスクリプトを示します。

#!/bin/bash
# create_test_file.sh

MONITOR_DIR="/tmp/coddykit_monitor"
mkdir -p "$MONITOR_DIR" # Ensure dir exists for this test script

# Create a unique test file
TEST_FILE="$MONITOR_DIR/test_log_$(date +%Y%m%d_%H%M%S).txt"
echo "This is a test entry." > "$TEST_FILE"
echo "Another line for testing." >> "$TEST_FILE"
echo "Created new test file: $TEST_FILE"

スクリプトのロジックの確認

この高度なスクリプトでは、多くの概念を組み合わせています。ここで、使用した主要なコマンドと構造を簡単に確認しましょう。

プロジェクトの目的を達成するうえで、それぞれのコマンドがどのような役割を果たしているか考えてみてください。

発展:スケジュール設定とカスタマイズ

このスクリプトは継続的に実行されるように設計されています。実際の環境では、nohup ./script.sh &を使ってバックグラウンドで実行するか、より一般的にはCronを使って定期的に実行するようスケジュールを設定します。

Cronは、このようなタスクの自動化に最適です。数分ごとに実行してディレクトリを確認し、必要に応じてファイルを処理するよう設定できます。

次のようなカスタマイズも検討してみてください。

  • 異なる種類のファイルを処理する。
  • 異なる処理を実行する(例:ファイルの圧縮、クラウドへのアップロード)。
  • より高度なエラー報告を追加する(例:メール通知)。

プロジェクトのまとめと次のステップ

おめでとうございます。Linuxコマンドとスクリプト技法を幅広く組み合わせた、高度なBashスクリプトのプロジェクトを完了しました。

次のことを学びました。

  • 堅牢で長時間実行されるスクリプトを構成する。
  • 設定に変数を使う。
  • 継続的な監視にループを実装する。
  • find、wc、mvなどのコマンドを組み合わせる。
  • trapによるエラー処理と正常な終了処理を追加する。

このプロジェクトは、より複雑な自動化ソリューションを構築するための確かな基礎になります。これからも試行錯誤しながら作り続けてください。

よくある質問

「高度なスクリプティングプロジェクト」レッスンは無料ですか?

はい。「高度なスクリプティングプロジェクト」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、DevOps Bootcampコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 DevOps Bootcampコースには全4レッスンが含まれています。

「高度なスクリプティングプロジェクト」で何を学びますか?

コマンドラインツールから高度なBashスクリプト技法まで、学んだ概念をすべて組み合わせた総合プロジェクトに取り組みます。 ブラウザで直接実行するハンズオンコードでDevOps Bootcampを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

DevOps Bootcampを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのDevOps Bootcampは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「高度なスクリプティングプロジェクト」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このDevOps Bootcampレッスンでコードを書いて実行できますか?

はい。すべてのDevOps Bootcampレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Cronによるタスクのスケジュール設定
  2. システム管理の自動化
  3. 高度なスクリプティングプロジェクト
  4. ログローテーションとクリーンアップの自動化
← DevOps Bootcampに戻る