diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/backupninja.in | 51 | 
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" | 
