Переписал скрипт оболочки для резервного копирования сервера, добавив функцию main

5 min

language: ja bn en es hi pt ru zh-cn zh-tw

Здравствуйте, я бездарь.
Я переписал скрипт оболочки для создания резервных копий, который писал некоторое время назад.

Введение

Я написал это некоторое время назад, но, пересмотрев, понял, что не включил код для удаления старых заархивированных файлов tar.gz, и подумал, что это будет немного длинно, поэтому объединил все в функцию main.
Для меня, как для ленивого человека, важно, чтобы все было как можно короче, поэтому я переписал его.
На самом деле, если бы я мог указать место назначения и источник резервной копии с помощью аргументов, это было бы более универсально и понятно при записи в cron, так что я сделаю это когда-нибудь.

Разбор

#!/bin/bash

MOUNT_DIR="/your/mount/point"

SRC_DIR="/want/to/backup/dir"
BK_DIR="backupdir"

EXCLUDE_FILE=""  # 除外ファイル指定 --exclude=your/path
W_DIR=`echo $SRC_DIR | awk -F/ '{print $(NF)}'`

# マウントポイントを確認し、マウントされていなければマウントする
check_mount() {
    df | grep "$MOUNT_DIR" > /dev/null
    if [ $? -ne 0 ]; then
        break
    else
        mount $MOUNT_DIR || exit 1
    fi
}

# 古いバックアップファイルを削除する
rm_old_backups() {
    BK_COUNT=`ls -1 $MOUNT_DIR/$BK_DIR/*.tar.gz 2>/dev/null | wc -l`
    if [ "$BK_COUNT" -ge 3 ]; then
        ls -1t $MOUNT_DIR/$BK_DIR/*.tar.gz | tail -n +4 | while read file; do
            rm -f "$file"
        done
    fi
}

# バックアップを作成する
create_backup() {
    rsync -av $EXCLUDE_FILE $SRC_DIR $MOUNT_DIR/$BK_DIR
    tar cfz $MOUNT_DIR/$BK_DIR/"$W_DIR"_`date +"%Y%m%d"`.tar.gz -C $MOUNT_DIR/$BK_DIR $W_DIR
    rm -rf $MOUNT_DIR/$BK_DIR/$W_DIR/*
}

main() {
    check_mount  # マウントを確認し、必要ならマウント
    mkdir -p $MOUNT_DIR/$BK_DIR  # バックアップディレクトリの作成
    rm_old_backups  # 古いバックアップの削除
    create_backup  # 新しいバックアップの作成
    umount $MOUNT_DIR || exit 1  # マウント解除
}

main

Поскольку предполагается монтирование/размонтирование, необходимо было включить проверку на это. Как ни странно, существует команда mountpoint, которая может определить, смонтировано ли что-то, но когда я попробовал ее, она показывала "не смонтировано", хотя на самом деле было смонтировано, и я не смог получить правильное возвращаемое значение.
Поэтому я подумал, что если что-то не смонтировано, оно не появится в выводе df, так что, если я буду использовать grep для стандартного вывода df и проверять возвращаемое значение, когда точка монтирования найдена, это должно быть довольно надежно.

Изначально я просто копировал файлы с помощью команды cp, а затем архивировал их с помощью tar, но мне захотелось указать "исключаемые файлы для копирования", и, похоже, rsync можно использовать. Вот почему все стали использовать rsync.

Причина, по которой я специально указал $W_DIR, заключалась в том, что мне нужно было создать это значение для использования с rsync.
И ключевым моментом является определение удаления старых файлов tar.gz. Я попробовал это, потому что почувствовал, что проверка с помощью ls вместо жадного просмотра подкаталогов с помощью find снижает нагрузку на дисковый ввод/вывод и является более безопасной.
Таким образом, получая имена файлов с помощью tail, можно четко определить, сколько файлов разрешено, и это довольно неплохо, не так ли?

Заключение

Ну, честно говоря, я не думаю, что это было настолько необходимо, чтобы выделять в функцию main, но мне кажется, что в итоге код стал более читаемым, так что пусть будет так.
На этом все. До новых встреч.

Related Posts