メインコンテンツへスキップ
レッスン 10 / 12推定時間:

実践:バックアップスクリプト作成

これまでの知識を活用して、実用的なバックアップスクリプトを作成します

このレッスンで学ぶこと

これまでに学んだシェルスクリプトの知識を総合して、実用的なバックアップスクリプトを作成します:

  • 要件定義と設計
  • 段階的な実装
  • エラーハンドリングの実装
  • テストとデバッグ

プロジェクトの要件

バックアップスクリプトの仕様

  1. 基本機能

    • 指定されたディレクトリを圧縮してバックアップ
    • タイムスタンプ付きのファイル名
    • 古いバックアップの自動削除
  2. オプション機能

    • 除外パターンの指定
    • バックアップ先の指定
    • 保持する世代数の設定
    • ドライラン機能
  3. エラーハンドリング

    • 入力検証
    • 容量チェック
    • 権限チェック

ステップ1: 基本構造の作成

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

ステップ2: オプション解析の実装

#!/bin/bash

# グローバル変数
BACKUP_DIR="$DEFAULT_BACKUP_DIR"
KEEP_DAYS="$DEFAULT_KEEP_DAYS"
EXCLUDE_PATTERNS=()
DRY_RUN=false

# オプション解析
parse_options() {
    while getopts "d:k:e:nh" opt; do
        case $opt in
            d)
                BACKUP_DIR="$OPTARG"
                ;;
            k)
                if ! [[ "$OPTARG" =~ ^[0-9]+$ ]]; then
                    echo "エラー: -k オプションには数値を指定してください" >&2
                    exit 1
                fi
                KEEP_DAYS="$OPTARG"
                ;;
            e)
                EXCLUDE_PATTERNS+=("$OPTARG")
                ;;
            n)
                DRY_RUN=true
                ;;
            h)
                usage
                ;;
            \?)
                echo "エラー: 無効なオプション -$OPTARG" >&2
                usage
                ;;
        esac
    done
    
    shift $((OPTIND-1))
    
    # 引数の確認
    if [ $# -eq 0 ]; then
        echo "エラー: ソースディレクトリを指定してください" >&2
        usage
    fi
    
    SOURCE_DIR="$1"
}
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

ステップ3: バックアップ処理の実装

# 入力検証
validate_input() {
    # ソースディレクトリの存在確認
    if [ ! -d "$SOURCE_DIR" ]; then
        error "ソースディレクトリが存在しません: $SOURCE_DIR"
        exit 1
    fi
    
    # ソースディレクトリの読み取り権限確認
    if [ ! -r "$SOURCE_DIR" ]; then
        error "ソースディレクトリを読み取れません: $SOURCE_DIR"
        exit 1
    fi
    
    # バックアップ先ディレクトリの作成
    if [ "$DRY_RUN" = false ]; then
        if ! mkdir -p "$BACKUP_DIR"; then
            error "バックアップディレクトリを作成できません: $BACKUP_DIR"
            exit 1
        fi
    fi
}

# バックアップ実行
perform_backup() {
    local source_basename=$(basename "$SOURCE_DIR")
    local timestamp=$(date "$DATE_FORMAT")
    local backup_filename="${source_basename}_backup_${timestamp}.tar.gz"
    local backup_path="$BACKUP_DIR/$backup_filename"
    
    # 除外オプションの構築
    local exclude_opts=()
    for pattern in "${EXCLUDE_PATTERNS[@]}"; do
        exclude_opts+=("--exclude=$pattern")
    done
    
    log "バックアップを作成中: $backup_path"
    
    if [ "$DRY_RUN" = true ]; then
        log "[DRY RUN] 実行するコマンド:"
        echo "tar -czf \"$backup_path\" ${exclude_opts[@]} -C \"$(dirname "$SOURCE_DIR")\" \"$source_basename\""
    else
        if tar -czf "$backup_path" "${exclude_opts[@]}" -C "$(dirname "$SOURCE_DIR")" "$source_basename"; then
            log "バックアップ作成成功"
            local size=$(du -h "$backup_path" | cut -f1)
            log "バックアップサイズ: $size"
        else
            error "バックアップの作成に失敗しました"
            exit 1
        fi
    fi
}
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

ステップ4: 高度な機能の追加

進捗表示機能

# 進捗表示付きバックアップ
perform_backup_with_progress() {
    local source_size=$(du -sb "$SOURCE_DIR" | cut -f1)
    local source_size_mb=$((source_size / 1024 / 1024))
    
    log "ソースサイズ: ${source_size_mb}MB"
    
    # pv コマンドが利用可能な場合は進捗表示
    if command -v pv >/dev/null 2>&1; then
        tar -cf - "${exclude_opts[@]}" -C "$(dirname "$SOURCE_DIR")" "$basename" | \
            pv -s "$source_size" | \
            gzip > "$backup_path"
    else
        tar -czf "$backup_path" "${exclude_opts[@]}" -C "$(dirname "$SOURCE_DIR")" "$basename"
    fi
}

設定ファイル対応

# 設定ファイルの読み込み
load_config() {
    local config_file="$HOME/.backup.conf"
    
    if [ -f "$config_file" ]; then
        log "設定ファイルを読み込み: $config_file"
        source "$config_file"
    fi
}

# 設定ファイル例
cat > ~/.backup.conf << 'EOF'
# バックアップ設定
DEFAULT_BACKUP_DIR="/mnt/backup"
DEFAULT_KEEP_DAYS=30
DEFAULT_EXCLUDE_PATTERNS=(
    "*.tmp"
    "*.log"
    "*.cache"
    ".git"
    "node_modules"
)
EOF

テストスクリプトの作成

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

実装のポイント

エラーハンドリング

  1. 入力検証

    • ディレクトリの存在確認
    • 権限チェック
    • パラメータの妥当性検証
  2. エラー時の動作

    • 明確なエラーメッセージ
    • 適切な終了コード
    • クリーンアップ処理

パフォーマンス

  1. 効率的な処理

    • 不要なファイルの除外
    • 圧縮レベルの調整
    • 並列処理の活用
  2. リソース管理

    • ディスク容量チェック
    • メモリ使用量の考慮
    • 一時ファイルの管理

拡張性

  1. モジュール化

    • 機能ごとの関数分割
    • 設定の外部化
    • プラグイン機構
  2. カスタマイズ

    • 設定ファイル対応
    • フック機能
    • 出力形式の選択

まとめ

このレッスンでは、実用的なバックアップスクリプトの作成を通じて:

  • 設計から実装まで: 要件定義から段階的な実装
  • エラーハンドリング: 堅牢なスクリプトの作成
  • テスト駆動開発: テストスクリプトによる品質保証
  • 実践的な機能: オプション解析、進捗表示、設定ファイル

これらの技術は、他のシステム管理タスクにも応用できます。

次のステップ

次のレッスンでは、ログ監視と通知機能を持つスクリプトを作成し、リアルタイムなシステム監視について学びます。

さらに学習を続けるには

素晴らしい学習ペースです!次のレッスンに進むには、無料会員登録をお願いします。無料会員では各コース3レッスンまで学習できます。

無料で続きを学ぶ

各コース3レッスンまで学習可能

学習進捗の自動保存

コース修了証明書の発行