From ce68a103486b1719eff1f2d4a0c674f26b62b217 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Fri, 14 Feb 2020 10:28:16 -0800 Subject: [PATCH] Move backup.sh->do_backup.sh backup.sh wraps do_backup.sh via flock so that multiple `restic backup`s dont pile up on each other in cases where a backup can take longer than the period specified in cron --- Dockerfile | 2 +- backup.sh | 50 ++++---------------------------------------- do_backup.sh | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 47 deletions(-) create mode 100644 do_backup.sh diff --git a/Dockerfile b/Dockerfile index 407c14c..93b2c0f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,7 +16,7 @@ ENV RESTIC_TAG=latest RUN apk add --update --no-cache ca-certificates fuse openssh-client bash tzdata WORKDIR /root COPY --from=build /usr/local/src/restic/restic /usr/local/bin -COPY entrypoint.sh backup.sh prune.sh forget.sh ./ +COPY entrypoint.sh backup.sh do_backup.sh prune.sh forget.sh ./ ENV PATH="./:${PATH}" RUN chmod a+x ./*.sh RUN mkdir -p /var/spool/cron/crontabs \ diff --git a/backup.sh b/backup.sh index 11df54d..eaae116 100644 --- a/backup.sh +++ b/backup.sh @@ -8,51 +8,9 @@ log() { echo "[$(date +"%Y-%m-%d %H:%M:%S")]$1" | tee -a "$logFile" } -showTime() { - num=$1 - min=0 - hour=0 - day=0 - if((num>59));then - ((sec=num%60)) - ((num=num/60)) - if((num>59));then - ((min=num%60)) - ((num=num/60)) - if((num>23));then - ((hour=num%24)) - ((day=num/24)) - else - ((hour=num)) - fi - else - ((min=num)) - fi - else - ((sec=num)) - fi - time="${day}d ${hour}h ${min}m ${sec}s" - log "[INFO] Total backup time: ${time}" -} - -start=$(date +%s) -log "[INFO] Starting backup" -log "[INFO] Log filename: ${logFile}" - -if [ -n "${RESTIC_BACKUP_ARGS}" ]; then - log "[INFO] RESTIC_BACKUP_ARGS: ${RESTIC_BACKUP_ARGS}" -fi - -restic backup /data ${RESTIC_BACKUP_ARGS} --tag="${RESTIC_TAG}" | tee -a "$logFile" +flock -xn /root/restic.lock /root/do_backup.sh rc=$? -if [[ $rc == 0 ]]; then - log "[INFO] Backup succeeded" -else - log "[ERROR] Backup failed with status ${rc}" - restic unlock - copyErrorLog - kill 1 +if [[ $rc != 0 ]]; then + log "[INFO] Backup already running. Exiting" fi -end=$(date +%s) -log "[INFO] Finished backup at $(date)" -showTime $((end-start)) + diff --git a/do_backup.sh b/do_backup.sh new file mode 100644 index 0000000..11df54d --- /dev/null +++ b/do_backup.sh @@ -0,0 +1,58 @@ +#!/bin/bash +set -e +# credit: some of the code for this script inspired by https://github.com/lobaro/restic-backup-docker + +logFile="/var/log/restic/backup/$(date +"%Y-%m-%d-%H-%M-%S").log" + +log() { + echo "[$(date +"%Y-%m-%d %H:%M:%S")]$1" | tee -a "$logFile" +} + +showTime() { + num=$1 + min=0 + hour=0 + day=0 + if((num>59));then + ((sec=num%60)) + ((num=num/60)) + if((num>59));then + ((min=num%60)) + ((num=num/60)) + if((num>23));then + ((hour=num%24)) + ((day=num/24)) + else + ((hour=num)) + fi + else + ((min=num)) + fi + else + ((sec=num)) + fi + time="${day}d ${hour}h ${min}m ${sec}s" + log "[INFO] Total backup time: ${time}" +} + +start=$(date +%s) +log "[INFO] Starting backup" +log "[INFO] Log filename: ${logFile}" + +if [ -n "${RESTIC_BACKUP_ARGS}" ]; then + log "[INFO] RESTIC_BACKUP_ARGS: ${RESTIC_BACKUP_ARGS}" +fi + +restic backup /data ${RESTIC_BACKUP_ARGS} --tag="${RESTIC_TAG}" | tee -a "$logFile" +rc=$? +if [[ $rc == 0 ]]; then + log "[INFO] Backup succeeded" +else + log "[ERROR] Backup failed with status ${rc}" + restic unlock + copyErrorLog + kill 1 +fi +end=$(date +%s) +log "[INFO] Finished backup at $(date)" +showTime $((end-start))