I want to run multiple Bash shell scripts in parallel. However, I want to avoid race conditions. What Unix commands are truly atomic that I could use for this purpose, and how can I use them?


7 Answers 7




# Makes sure we exit if flock fails.
set -e

  # Wait for lock on /var/lock/.myscript.exclusivelock (fd 200) for 10 seconds
  flock -x -w 10 200

  # Do stuff

) 200>/var/lock/.myscript.exclusivelock

This ensures that code between "(" and ")" is run only by one process at a time and that the process does wait for a lock too long.

  • Nice one, didn't know about it. However, it's apparently Linux-specific... Commented Sep 7, 2010 at 19:52
  • 1
    @Riccardo, FreeBSD has a similar command: lockf(1).
    – Alex B
    Commented Sep 8, 2010 at 11:08
  • lockf(1) doesn't work in the way used in this example, though. It can't take a file descriptor number as an argument.
    – Charley
    Commented Oct 28, 2016 at 7:36
  • @RiccardoMurri brew install discoteq/discoteq/flock
    – HappyFace
    Commented May 26, 2020 at 13:14
  • 1
    Shorter but equivalent: flock -w 10 /var/lock/.myscript.exclusivelock -c '# do stuff'. No need for ( ... ) 200> ... if you only execute a few simple commands. However, if you want to modify the environment (for instance, assign a variable inside the lock for later use) then use { ... } 200> ....
    – Socowi
    Commented Sep 10, 2020 at 21:38

If lockfile is not installed on your system, then mkdir will do the work: it's an atomic operation, and it fails if the directory already exists (as long as you don't add the -p command-line switch).

create_lock_or_wait () {
  while true; do
        if mkdir "${path}.lock.d"; then
        sleep $wait_time

remove_lock () {
  rmdir "${path}.lock.d"

lockfile(1) looks like a good candidate, though beware that it's part of the procmail package, which you may not have installed on your machine yet. It's a popular enough package that it should be packaged for your system if it's not installed yet. Three of the four systems I checked have it, and the other has it available.

Using it is simple:

mkdir -p `dirname $LOCKFILE`

echo Waiting for lock $LOCKFILE...
if lockfile -1 -r15 $LOCKFILE
    # Do protected stuff here
    echo Doing protected stuff...

    # Then, afterward, clean up so another instance of this script can run
    rm -f $LOCKFILE
    echo "Failed to acquire lock!  lockfile(1) returned $?"
    exit 1

The options I've given make it retry once a second for up to 15 seconds. Drop the "-r" flag if you want it to wait forever.

  • 2
    Just for reference - the man page: linux.die.net/man/1/lockfile. :) Commented Aug 10, 2010 at 21:50
  • 1
    Be aware that (according to the manpage), "Once a file is locked, the lock must be touched at least once every five minutes or the lock will be considered stale, and subsequent lock attempts will succeed."
    – Jay
    Commented Jan 5, 2019 at 19:19

The system call mkdir() is atomic on POSIX filesystems. So, using the mkdir command in such a way that it involves exactly one call to mkdir() would achieve your purpose. (IOW, don't use mkdir -p). The corresponding unlock is rmdir of course.

Caveat emptor: mkdir() might not be atomic on network filesystems.

  • 2
    is rmdir therefore also atomic? Commented May 11, 2017 at 23:20

Maybe the lockfile command will do what you need.

lockfile ~/.config/mylockfile.lock
rm -f important.lock
  • 3
    This seems to delete the wrong file. Commented Jul 13, 2019 at 19:19

If you're only running on Unix, use fifos. You can write work records to the fifo and have processes read from this file and your readers will block on the fifos.

Lock files are ok, but for what you describe I would go with fifos


As posted here: " Correct locking in shell scripts? ", using FLOM (Free LOck Manager) tool, serializing commands and shell scripts becomes as easy as running

flom -- command_to_serialize

FLOM allows you to implement more sofisticate use cases (distributed locking, readers/writers, numeric resources, etc...) as explained here: http://sourceforge.net/p/flom/wiki/FLOM%20by%20examples/

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .