aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Berger <oberger@ouvaton.org>2010-12-24 09:28:31 +0100
committerOlivier Berger <oberger@ouvaton.org>2010-12-24 09:28:31 +0100
commitc5832421a551550a87dc4ff1062ae659b67b332e (patch)
tree4a9d21a9c94db1314a3f29817a91145fa1dc5bcb
parent6ad15139e00ef378ee035b15c25cf7a40127e689 (diff)
downloadbackupninja-c5832421a551550a87dc4ff1062ae659b67b332e.tar.gz
backupninja-c5832421a551550a87dc4ff1062ae659b67b332e.tar.bz2
Implement locking with flock
-rwxr-xr-xsrc/backupninja.in51
1 files changed, 38 insertions, 13 deletions
diff --git a/src/backupninja.in b/src/backupninja.in
index aadc162..f6a5b0e 100755
--- a/src/backupninja.in
+++ b/src/backupninja.in
@@ -313,23 +313,47 @@ function process_action() {
debug $run
[ "$run" == "no" ] && return
- let "actions_run += 1"
+ # Prepare for lock creation
+ if [ ! -d /var/lock/backupninja ]; then
+ mkdir /var/lock/backupninja
+ fi
+ lockfile=`echo $file | @SED@ 's,/,_,g'`
+ lockfile=/var/lock/backupninja/$lockfile
- # call the handler:
local bufferfile=`maketemp backupninja.buffer`
echo "" > $bufferfile
- echo_debug_msg=1
+
+ # start locked section : avoid concurrent execution of the same backup
+ # uses a construct specific to shell scripts with flock. See man flock for details
(
- . $scriptdirectory/$suffix $file
- ) 2>&1 | (
- while read a; do
- echo $a >> $bufferfile
- [ $debug ] && colorize "$a"
- done
- )
- retcode=$?
- # ^^^^^^^^ we have a problem! we can't grab the return code "$?". grrr.
- echo_debug_msg=0
+ debug "executing handler in locked section controlled by $lockfile"
+ flock -x -w 5 200
+ # if all is good, we acquired the lock
+ if [ $? -eq 0 ]; then
+
+ let "actions_run += 1"
+
+ # call the handler:
+ echo_debug_msg=1
+ (
+ . $scriptdirectory/$suffix $file
+ ) 2>&1 | (
+ while read a; do
+ echo $a >> $bufferfile
+ [ $debug ] && colorize "$a"
+ done
+ )
+ retcode=$?
+ # ^^^^^^^^ we have a problem! we can't grab the return code "$?". grrr.
+ echo_debug_msg=0
+
+ else
+ # a backup is probably ongoing already, so display an error message
+ debug "failed to acquire lock"
+ echo "Fatal: Could not acquire lock $lockfile. A backup is probably already running for $file." >>$bufferfile
+ fi
+ ) 200> $lockfile
+ # end of locked section
_warnings=`cat $bufferfile | grep "^Warning: " | wc -l`
_errors=`cat $bufferfile | grep "^Error: " | wc -l`
@@ -339,6 +363,7 @@ function process_action() {
ret=`grep "\(^Info: \|^Warning: \|^Error: \|^Fatal: \|Halt: \)" $bufferfile`
rm $bufferfile
+
if [ $_halts != 0 ]; then
msg "*halt* -- $file"
errormsg="$errormsg\n== halt request from $file==\n\n$ret\n"