Переписал скрипт оболочки для резервного копирования сервера, добавив функцию main
Здравствуйте, я бездарь.
Я переписал скрипт оболочки для создания резервных копий, который писал некоторое время назад.
Введение
Я написал это некоторое время назад, но, пересмотрев, понял, что не включил код для удаления старых заархивированных файлов 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, но мне кажется, что в итоге код стал более читаемым, так что пусть будет так.
На этом все. До новых встреч.