このレッスンで学ぶこと
これまでに学んだシェルスクリプトの知識を総合して、実用的なバックアップスクリプトを作成します:
- 要件定義と設計
- 段階的な実装
- エラーハンドリングの実装
- テストとデバッグ
プロジェクトの要件
バックアップスクリプトの仕様
-
基本機能
- 指定されたディレクトリを圧縮してバックアップ
- タイムスタンプ付きのファイル名
- 古いバックアップの自動削除
-
オプション機能
- 除外パターンの指定
- バックアップ先の指定
- 保持する世代数の設定
- ドライラン機能
-
エラーハンドリング
- 入力検証
- 容量チェック
- 権限チェック
ステップ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
実装のポイント
エラーハンドリング
-
入力検証
- ディレクトリの存在確認
- 権限チェック
- パラメータの妥当性検証
-
エラー時の動作
- 明確なエラーメッセージ
- 適切な終了コード
- クリーンアップ処理
パフォーマンス
-
効率的な処理
- 不要なファイルの除外
- 圧縮レベルの調整
- 並列処理の活用
-
リソース管理
- ディスク容量チェック
- メモリ使用量の考慮
- 一時ファイルの管理
拡張性
-
モジュール化
- 機能ごとの関数分割
- 設定の外部化
- プラグイン機構
-
カスタマイズ
- 設定ファイル対応
- フック機能
- 出力形式の選択
まとめ
このレッスンでは、実用的なバックアップスクリプトの作成を通じて:
- 設計から実装まで: 要件定義から段階的な実装
- エラーハンドリング: 堅牢なスクリプトの作成
- テスト駆動開発: テストスクリプトによる品質保証
- 実践的な機能: オプション解析、進捗表示、設定ファイル
これらの技術は、他のシステム管理タスクにも応用できます。
次のステップ
次のレッスンでは、ログ監視と通知機能を持つスクリプトを作成し、リアルタイムなシステム監視について学びます。