Reescrevi o script shell de backup do servidor com a função main
Olá, sou um inútil.
Reescrevi o script shell para criação de backup que havia escrito há algum tempo.
Introdução
Eu havia escrito isso há um tempo, mas ao revisar, percebi que não incluía o código para excluir arquivos tar.gz antigos de backup, e achei que ficaria um pouco longo, então o organizei em uma função main.
Para mim, que sou preguiçoso, é importante que seja o mais curto possível, então tentei reescrevê-lo.
Na verdade, se eu pudesse especificar o destino e a origem do backup com argumentos, seria mais versátil e fácil de entender ao descrever no cron, então farei isso em algum momento.
Análise
#!/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
Como estou assumindo que haverá montagem/desmontagem, precisei incluir essa verificação. É estranho, mas tentei usar o comando mountpoint para verificar se estava montado, e mesmo estando montado, ele exibia 'não montado', e não consegui obter um valor de retorno adequado.
Então, de repente, pensei que se não estivesse montado, não apareceria no resultado do `df`, então se eu usar `grep` na saída padrão do `df` e verificar o valor de retorno quando o ponto de montagem for encontrado, provavelmente estaria correto...
Originalmente, eu simplesmente copiava com o comando `cp` e depois compactava com `tar`, mas queria especificar "arquivos a serem excluídos da cópia", e parece que `rsync` pode ser usado. É por isso que todo mundo está usando `rsync`.
A razão pela qual especifiquei $W_DIR é porque precisava criar um valor para usá-lo com `rsync`.
E o ponto crucial é a lógica para excluir arquivos `tar.gz` antigos. Tentei fazê-lo verificando com `ls`, pois assim não há necessidade de `find` ir gananciosamente para os subdiretórios, o que senti que seria mais seguro e menos oneroso em termos de I/O de disco.
Ao obter os nomes dos arquivos com `tail`, posso decidir claramente quantos arquivos permitir, e isso é surpreendentemente bom, não é?
Fim
Bem, para ser honesto, não acho que fosse necessário criar uma função main, mas sinto que o resultado ficou mais legível, então está bom.
Então é isso. Até a próxima.