Package: backup2l Version: 1.6-3 Severity: normal Tags: upstream patch Dear Maintainer,
backup2l can sometimes fail to detect a running instance, such that two instances are running at the same time. This occurs when backup2l is run manually, and then disowned such that backup2l no longer belongs to the shell I used to start it. If I then run backup2l again while the disowned backup2l is still running, the second run will start running rather that complaining about the lock file and existing. Or, if the daily cron job runs, it will start another instance of backup2l. To reproduce, do this as root, in bash: backup2l -b disown %1 Then while the disowned instance is still running: backup2l -s This will run, instead of complaining about the lockfile as expected. It then removes the lock file. I believe this occurs because backup2l is using `ps -a` to find the running backup2l instances, but a disowned backup2l does not show up in `ps -a`. Instead, `ps -ax` needs to be used. The attached patch, which has this change, seems to fix the problem for me. Background: I disowned the manual backup2l because I needed the long-running manual backup to continue even if the SSH session were interrupted. -- System Information: Debian Release: 8.10 APT prefers oldstable APT policy: (990, 'oldstable'), (500, 'oldstable-updates'), (500, 'unstable') Architecture: amd64 (x86_64) Kernel: Linux 3.16.0-5-amd64 (SMP w/4 CPU cores) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Init: systemd (via /run/systemd/system) backup2l depends on no packages. Versions of packages backup2l recommends: ii bzip2 1.0.6-7+b3 Versions of packages backup2l suggests: ii xz-utils 5.1.1alpha+20120614-2+b3 -- Configuration Files: /etc/backup2l.conf changed: FOR_VERSION=1.5 VOLNAME="all" SRCLIST=(/mnt/sdc/mls/nwmls /mnt/sdf/terabitz) SKIPCOND=(-xdev -path ./documents.new -prune) BACKUP_DIR="/mnt/hcf/diamond_backups" MAX_LEVEL=8 MAX_PER_LEVEL=8 MAX_FULL=2 GENERATIONS=1 CREATE_CHECK_FILE=1 PRE_BACKUP () { echo " pre-backup: nothing to do" # e. g., shut down some mail/db servers if their files are to be backup'ed # On a Debian system, the following statements dump a machine-readable list of # all installed packages to a file. #echo " writing dpkg selections to /root/dpkg-selections.log..." #dpkg --get-selections | diff - /root/dpkg-selections.log > /dev/null || dpkg --get-selections > /root/dpkg-selections.log } POST_BACKUP () { # e. g., restart some mail/db server if its files are to be backup'ed echo " post-backup: nothing to do" } AUTORUN=0 SIZE_UNITS="" # set to "B", "K", "M" or "G" to obtain unified units in summary list DRIVER_MY_AFIOZ () { case $1 in -test) # This function should check whether all prerequisites are met, especially if all # required tools are installed. This prevents backup2l to fail in inconvenient # situations, e. g. during a backup or restore operation. If everything is ok, the # string "ok" should be returned. Everything else is interpreted as a failure. require_tools afio # The function 'require_tools' checks for the existence of all tools passed as # arguments. If one of the tools is not found by which(1), an error message is # displayed and the function does not return. echo "ok" ;; -suffix) # This function should return the suffix of backup archive files. If the driver #�does not create a file (e. g. transfers the backup data immediately to a tape # or network device), an empty string has to be returned. backup2l uses this suffix # to select a driver for unpacking. If a user-configured driver supports the same # suffix as a built-in driver, the user driver is preferred (as in this case). echo "afioz" ;; -create) # Arguments: $2 = BID, $3 = archive file name, $4 = file list file # This function is called to create a backup file. The argument $3 is the full file # name of the archive file including path and suffix. $4 contains an alphabetically # sorted list of files (full pathname) to be backed up. Directories are not contained, # they are handled by backup2l directly without using the driver. # All output to stderr should be directed to stdout ("2>&1"). afio -Zo -G 9 -M 30m -T 2k $3 < $4 2>&1 # This line passes some additional options to afio (see afio(1)): # '-G 9' maximizes the compression by gzip. # '-M 30m' increases the size of the internal file buffer. Larger files have to # be compressed twice. # '-T 2k' prevents the compression of files smaller than 2k in order to save time. ;; -toc) # Arguments: $2 = BID, $3 = archive file name # This function is used to validate the correct generation of an archive file. # The output is compared to the list file passed to the '-create' function. # Any difference is reported as an error. afio -Zt $3 | sed 's#^#/#' # The sed command adds a leading slash to each entry. ;; -extract) # Arguments: $2 = BID, $3 = archive file name, $4 = file list file # This function is called by backup2l's restore procedure for each archive. # It is extremely important that only those files contained in $4 are restored. # Otherwise it may happen that files are overwritten by incorrect (e. g. older) # versions of the same file. afio -Zinw $4 $3 2>&1 ;; esac } DRIVER_TAR_GZ_SPLIT () { case $1 in -test) require_tools tar split cat echo "ok" ;; -suffix) echo "tgz_split" ;; -create) # Arguments: $2 = BID, $3 = archive file name, $4 = file list file mkdir -p ${3} tar cz -T $4 --no-recursion | split --bytes=725100100 - ${3}/part_ ;; -toc) # Arguments: $2 = BID, $3 = archive file name cat ${3}/part_* | tar tz | sed 's#^#/#' ;; -extract) # Arguments: $2 = BID, $3 = archive file name, $4 = file list file cat ${3}/part_* | tar xz --same-permission --same-owner -T $4 2>&1 ;; esac } DRIVER_MY_AFIOBZ2 () { case $1 in -test) require_tools afio bzip2 echo "ok" ;; -suffix) echo "afio-bz2" ;; -create) # Arguments: $2 = BID, $3 = archive file name, $4 = file list file afio -z -1 m -P bzip2 -Q -9 -Z -M 50m -T 1k -o $3 <$4 2>&1 # This line passes some additional options to afio (see afio(1)): # '-P bzip2' utilizes bzip2 as an external compressor # '-Q 9' maximizes the compression by bzip2. # '-M 50m' increases the size of the internal file buffer. Larger files have to # be compressed twice. # '-T 1k' prevents the compression of files smaller than 1k in order to save time. ;; -toc) # Arguments: $2 = BID, $3 = archive file name afio -t -Z -P bzip2 -Q -d - <$3 | sed 's#^#/#' # The sed command adds a leading slash to each entry. ;; -extract) # Arguments: $2 = BID, $3 = archive file name, $4 = file list file afio -Zinw $4 -P bzip2 -Q -d - <$3 2>&1 ;; esac } DRIVER_MY_AFIO_BZ2 () { case $1 in -test) require_tools afio bzip2 echo "ok" ;; -suffix) echo "afio.bz2" ;; -create) # Arguments: $2 = BID, $3 = archive file name, $4 = file list file afio -o - < $4 | bzip2 --best > $3 2>&1 ;; -toc) # Arguments: $2 = BID, $3 = archive file name bzip2 -d < $3 | afio -t - | sed 's#^#/#' # The sed command adds a leading slash to each entry. ;; -extract) # Arguments: $2 = BID, $3 = archive file name, $4 = file list file bzip2 -d < $3 | afio -inw $4 - 2>&1 ;; esac } DRIVER_ZIP () { case $1 in -test) require_tools zip echo "ok" ;; -suffix) echo "zip" ;; -create) # Arguments: $2 = BID, $3 = archive file name, $4 = file list file cat $4| zip -qy $3 -@ ;; -toc) # Arguments: $2 = BID, $3 = archive file name zipinfo -1 $3| sed 's#^#/#' ;; -extract) # Arguments: $2 = BID, $3 = archive file name, $4 = file list file echo "Not implemented yet! Sorry." #unzip $3 ;; esac } DRIVER_TAR_GPG () { case $1 in -test) require_tools tar gpg echo "ok" ;; -suffix) echo "tar.pgp" ;; -create) # Arguments: $2 = BID, $3 = archive file name, $4 = file list file tar -c -T $4 --no-recursion | /usr/bin/gpg --batch --no-tty -q --passphrase-fd 3 3</etc/backup2l.pass -c - > $3 ;; -toc) # Arguments: $2 = BID, $3 = archive file name /usr/bin/gpg --batch --no-tty -q --passphrase-fd 3 3</etc/backup2l.pass -d $3 2>/dev/null | tar t | sed 's#^#/#' ;; -extract) # Arguments: $2 = BID, $3 = archive file name, $4 = file list file /usr/bin/gpg --batch --no-tty -q --passphrase-fd 3 3</etc/backup2l.pass -d $3 2>/dev/null | tar -x --same-permission --same-owner -T $4 2>&1 ;; esac } /etc/cron.daily/zz-backup2l changed: -- no debconf information
--- backup2l.orig 2019-03-14 12:06:48.122119093 -0700 +++ /usr/sbin/backup2l 2019-03-14 12:07:05.214389077 -0700 @@ -337,7 +337,7 @@ fi # Locking: Begin if [ -e $BACKUP_DIR/$VOLNAME.lock ]; then - if [ `ps -a | grep -af $BACKUP_DIR/$VOLNAME.lock | grep -a ${0##*/} | wc -l` -gt 0 ]; then + if [ `ps -ax | grep -af $BACKUP_DIR/$VOLNAME.lock | grep -a ${0##*/} | wc -l` -gt 0 ]; then echo "ERROR: Backup volume is locked." echo echo "Another instance is currently running. If you are sure that this is not"