flock in bash script

util-linux(-ng) flock

On Linux systems, there is a `flock' command (from `util-linux' or `util-linux-ng') that can be used to run a command inside a file lock/unlock block.

function run_lock_flock {
  LOCK=$1
  shift
  touch "$LOCK"
  flock "$LOCK" "$@"
}

portable way with perl

On other Unix systems, a portable way could be to use perl to mimic the util-linux(-ng) command shown above:

function run_lock_perl {
  LOCK=$1
  shift
  perl -e '
    use Fcntl":flock";
    $l=shift;
    open(L,">>",$l)||die"Error open: $!\n";flock(L,LOCK_EX)||die"Error lock: $!\n";
    system(@ARGV);$?==-1&&die"Error executing command!";
    flock(L,LOCK_UN);close(L);
    exit($?>>8)
  ' "$LOCK" "$@"
}

autodetect flock

Finally, a main `run_lock' function to autodetect which type of flock to use, and run the given command with the given lock file.

function run_lock {
  type -p flock
  if [ $? -eq 0 ]; then
    run_lock_flock "$@"
  else
    run_lock_perl "$@"
  fi
}

run_lock mylock.lck /usr/bin/foo -c bar -l baz
Ce contenu a été publié dans code. Vous pouvez le mettre en favoris avec ce permalien.