Reescribí el script de shell de respaldo del servidor con una función main

5 min

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

Hola, soy Incompetente.
Reescribí el script de shell que había escrito hace un tiempo para crear copias de seguridad.

Introducción

Lo había escrito hace un tiempo, pero al revisarlo, me di cuenta de que no había incluido el código para eliminar los archivos tar.gz antiguos de las copias de seguridad, y pensé que se estaba volviendo un poco largo, así que lo organicé en una función main.
Para mí, que soy perezoso, es importante que sea lo más corto posible, así que lo reescribí.
En realidad, si pudiera especificar el destino y el origen de la copia de seguridad con argumentos, sería más versátil y fácil de entender cuando se escribiera en cron, así que lo haré en algún momento.

Desglose

#!/bin/bash

MOUNT_DIR="/your/mount/point"

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

EXCLUDE_FILE=""  # Especificar archivo a excluir --exclude=your/path
W_DIR=`echo $SRC_DIR | awk -F/ '{print $(NF)}'`

# Comprueba el punto de montaje y lo monta si no está montado
check_mount() {
    df | grep "$MOUNT_DIR" > /dev/null
    if [ $? -ne 0 ]; then
        break
    else
        mount $MOUNT_DIR || exit 1
    fi
}

# Elimina archivos de respaldo antiguos
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
}

# Crea una copia de seguridad
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  # Comprueba el montaje y monta si es necesario
    mkdir -p $MOUNT_DIR/$BK_DIR  # Crea el directorio de copia de seguridad
    rm_old_backups  # Elimina copias de seguridad antiguas
    create_backup  # Crea una nueva copia de seguridad
    umount $MOUNT_DIR || exit 1  # Desmonta
}

main

Dado que se asume que se montará/desmontará, era necesario incluir esa verificación. Es extraño, pero aunque existe un comando mountpoint para verificar si está montado, cuando lo probé, mostraba 'no montado' a pesar de estarlo, y no pude obtener un valor de retorno adecuado.
Así que, de repente, pensé que si no está montado, no aparecerá en el resultado de df, por lo que si hago un grep en la salida estándar de df para el punto de montaje y uso el valor de retorno para la verificación, debería ser bastante fiable...

Originalmente, simplemente copiaba con el comando cp y luego lo comprimía con tar, pero quería especificar "archivos a excluir de la copia", y parece que rsync se puede usar para eso. Por eso todo el mundo usa rsync.

La razón por la que especifico $W_DIR es porque necesitaba crear un valor para usarlo con `rsync`.
Y lo crucial es la lógica para decidir la eliminación de archivos `tar.gz` antiguos. Lo probé porque sentí que era más seguro y menos intensivo en E/S de disco, ya que al verificar con `ls`, no hay necesidad de que `find` busque codiciosamente en los subdirectorios.
Y al obtener los nombres de archivo con `tail`, puedo decidir claramente cuántos archivos permitir, lo cual creo que es bastante bueno, ¿no?

Fin

Bueno, para ser honesto, no creo que fuera tan necesario ponerlo en una función main, pero siento que el resultado es más fácil de leer, así que lo daré por bueno.
Eso es todo. Hasta la próxima.

Related Posts